是否StackExchange.Dapper支持以下 SQL 语法吗?

INSERT INTO MyTable (a, b, c) 
VALUES 
  (1, 2, 3), 
  (4, 5, 6), 
  (7, 8, 9); 

我看过一些示例,您可以在其中传递要插入的列表,但我看到的描述表明它只是循环并进行多次插入。

我的研究表明,执行包含多行的单个查询速度更快,所以我很想知道 Dapper 是否支持列表。

请您参考如下方法:

不,它没有。

实际上,批量插入是讨论最多的问题之一。我从未遇到过您正在使用 Dapper 寻找的解决方案。

我可以想象(不确定;从未尝试过)的一个 hack 是通过 DynamicParameters 替换您的实际值(1、2、3....)。所以你的查询变成如下所示:

INSERT INTO MyTable (a, b, c) 
VALUES 
  (@1, @2, @3), 
  (@4, @5, @6), 
  (@7, @8, @9); 

并且,您传入 DynamicParameters 如下所示:

var param = new DynamicParameters(); 
param.Add("@1", ...); 
param.Add("@2", ...); 
param.Add("@3", ...); 
param.Add("@4", ...); 
.... 

正如我上面所说,这就是我的想象;我没试过。即使可行,这也不是一个好的解决方案,因为字符串构建成本会很高,而且管理太多参数会很棘手。此外,在 RDBMS 端,您可以传递多少个最大参数是有限制的。所以,我不推荐这个。

如果记录数不是太多或者性能不是那么关键(仍然很重要;我同意),将 List 传递给 INSERT 查询(如您mentioned 有问题)效果很好。在 Transaction 中封装 Execute 调用可能有帮助。

否则,一般推荐以下解决方案:

  1. 绕过 Dapper;使用 ADO.NET。
  2. 使用带有用户定义表参数的存储过程。
  3. Passing Table Valued Parameters with Dapper
  4. 使用其他工具,例如 SqlBulkCopy , Dapper Plus , MicroOrm.Dapper.Repositories等等
    我从未使用过这些工具;所以我不知道它们的性能或其他缺点。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!