Dapper 是否支持在单个查询中插入多行?

2024-04-15

Does StackExchange.Dapper https://github.com/StackExchange/Dapper支持以下SQL语法吗?

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

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

我的研究表明,执行包含多行的单个查询速度更快,因此我很好奇 Dapper 是否支持列表。


不,没有。

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

我可以想象的一种技巧(不确定;从未尝试过)是通过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", ...);
....

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

如果记录数量不是太多或者性能不是那么重要(仍然很重要;我同意),则传入List to INSERT查询(如您提及 http://dapper-tutorial.net/execute#example---execute-insert有问题)效果很好。包装Execute打电话进来交易 https://stackoverflow.com/q/10689779/5779732可能有帮助。

否则,通常建议采用以下解决方案:

  1. 绕过Dapper;使用 ADO.NET。
  2. 使用带有用户定义表参数的存储过程。
  3. 使用 Dapper 传递表值参数 https://www.codeproject.com/Articles/835519/Passing-Table-Valued-Parameters-with-Dapper
  4. 使用其他一些工具,例如SQL批量复制 https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx, 精致加 http://dapper-tutorial.net/bulk-insert#example---insert-many, MicroOrm.Dapper.Repositories https://github.com/phnx47/MicroOrm.Dapper.Repositories/blob/master/src/MicroOrm.Dapper.Repositories/DapperRepository.BulkInsert.cs etc.
    我从来没有使用过这些工具;所以我不知道他们的性能或其他缺点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dapper 是否支持在单个查询中插入多行? 的相关文章

随机推荐