使用列表参数批量插入/更新调用到 Dapper 中对数据库的单个操作/请求

Posted

技术标签:

【中文标题】使用列表参数批量插入/更新调用到 Dapper 中对数据库的单个操作/请求【英文标题】:Batch insert/update calls with a list parameter into a single operation/request to database in Dapper 【发布时间】:2018-04-17 05:45:19 【问题描述】:

根据 Dapper 的 github 页面上的这段代码,我创建了一个批量插入语句。

Dapper 将查询拆分为多个单独的 SQL 插入语句(如 SQL 分析器中所示)。

是否可以指示它将多个操作更改为单个操作以减少 DB 行程的次数,而无需手动创建多个插入语句,如下所示?

insert into test (a,b) values (b,c);
insert into test (a,b) values (d,e);
insert into test (a,b) values (f,g);

【问题讨论】:

是的,在 C# 中使用 SqlBulkCopy。 msdn.microsoft.com/en-us/library/… 【参考方案1】:

是否可以指示它把多个操作变成一个操作

没有

允许执行批量操作通常有两个答案:

SqlBulkCopy

​​>

正如@iSR5 在评论区的回答:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy

你找不到比这更快的东西了。

小巧玲珑

免责声明:我是项目的所有者Dapper Plus

此项目不是免费的,但提供所有批量操作:

批量插入 批量更新 批量删除 批量合并

(在后台使用SqlBulkCopy

还有更多选项,例如输出标识值:

// CONFIGURE & MAP entity
DapperPlusManager.Entity<Order>()
                 .Table("Orders")
                 .Identity(x => x.ID);

// CHAIN & SAVE entity
connection.BulkInsert(orders)
          .AlsoInsert(order => order.Items);
          .Include(x => x.ThenMerge(order => order.Invoice)
                         .AlsoMerge(invoice => invoice.Items))
          .AlsoMerge(x => x.ShippingAddress);   

编辑:回复评论

SqlBulkCopy 只能用于 MS SQL Server。不是吗?

没错,SqlBulkCopy 只与 SQL Server 兼容。我们的库支持多个提供者:

SQL 服务器 SQL 精简版 甲骨文 mysql PostgreSQL SQLite 火鸟

【讨论】:

SqlBulkCopy 只能用于 MS SQL Server。不是吗?

以上是关于使用列表参数批量插入/更新调用到 Dapper 中对数据库的单个操作/请求的主要内容,如果未能解决你的问题,请参考以下文章

使用没有字母参数的 Postgresql 的 Dapper 存储过程

用dapper插入多个对象

C# 中的批量更新

Dapper:过程或函数指定了太多参数

如何使用 Dapper 将 list<myobject> 作为参数插入到存储过程

为什么 Dapper 的批量插入比我预期的要慢很多?