了解 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.

如果没有你也能正常工作:那就做吧!