DataTable.AsTableValuedParameter
方法在使用Dapper将数据表作为TVP传递给DB时返回SqlMapper.ICustomQueryParameter
?
我可以像普通的数据一样将TVP发送到DB并执行查询就好了。我不确定在它上面执行AsTableValuedParameter
是什么。
例如,这工作:
int rowsAffected = await conn.ExecuteAsync(
"MyProc",
new
{
myVar = (DataTable)GetThatDataTable(),
},
commandType: CommandType.StoredProcedure);
另外,另一个问题是, AsTableValuedParameter
方法中对typeName
可选参数的需求是什么?没有它也可以正常工作。
它适用于您的情况,因为您正在使用存储过程;用户定义的类型需要来自某个地方 ,并且在存储过程的情况下:某处可以是声明的参数类型。
但是,dapper也适用于ad-hoc CommandText
查询。在这种情况下,没有此调用: 没有类型名称 ,并且调用将失败。对我来说重要的是功能也支持CommandText
,因为这是一个非常常见的用例。
如果没有它可以正常工作:那样做!
传递SQL Server表值参数需要类型名称,因此它不是可选的。它必须来自某个地方。
SqlMapper
有一个扩展方法,用于在其ExtendedProperties
中设置DataTable
的类型名称。如果未在AsTableValuedParameter
方法中指定类型名称,则会检查ExtendedProperties
的类型名称。
因此类型名称仍然被指定,而不是在你正在寻找的方法中。它可能发生在创建和返回DataTable
的方法中。寻找使用public static void SetTypeName(this DataTable table, string typeName)
。
SqlMapper
源码 ,第3672行。
这很方便,因为如果给定的DataTable
类型仅用于作为表值参数传递,那么您应该能够将它与该参数的类型相关联。这样可以更轻松地识别DataTable
必须符合的模式。