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