【问题标题】:Insert many rows with Dapper使用 Dapper 插入多行
【发布时间】:2017-11-02 15:29:17
【问题描述】:

使用 Dapper 将多行插入 SQL Server 的最佳解决方案是什么? 当我有大约 8k 条记录时,我的数据库连接超时并失败。

在我的应用程序的最后阶段,我有一个表格列表,其中每个表格都有行列表。

我所做的是在每个表上创建事务和 foreaching,然后在每一行和 conn.CreateCommand 上进行 foreaching,填充参数和 executeNonQuery。因此,如果我有 9k 条记录,我实际上是在执行 9k 次 executeNonQuery 操作。

我还有更好的选择吗?

【问题讨论】:

标签: c# .net ado.net dapper sqlconnection


【解决方案1】:

同意 DaniCE,SqlBulkCopy 是要走的路。最近我遇到了这种情况,我用 dapper 处理大部分数据,但数据量更大,在我的例子中,有数百万条记录,Dapper 曾经不是我最好的朋友。

    private void BulkCopy(SqlConnection sqlConnection,string tableName, DataTable dataTable)
    {
        using (var bulkCopy = new SqlBulkCopy(sqlConnection))
        {
            bulkCopy.DestinationTableName = tableName;
            bulkCopy.BatchSize = 50000;
            bulkCopy.BulkCopyTimeout = 60; //seconds

            bulkCopy.WriteToServer(dataTable);
        }
    }

【讨论】:

  • 谢谢,从来没有听说过批量插入,也没有 SqlBuklCopy 类。刚刚在你的帖子之后对这个话题进行了一些研究,这正是我所需要的!再次感谢!!
【解决方案2】:

毫无疑问,最好的免费方式是 @JFM 和 @DaniCE 建议的 SqlBulkCopy


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

此库不是免费的,但为以下操作提供了简单的支持:

  • 批量插入
  • 批量更新
  • 批量删除
  • 批量合并
  • 批量同步

通过使用映射并允许像标识列一样输出值。

// 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);   

【讨论】:

  • connection.BulkInsert(models).AlsoBulkInsert(model => model.SelectMany(c => c.Variables));如果您注意到 AlsoBulkInsert 是一个列表,那么在您的示例中它不是。我是否缺少 using 语句?
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 2011-10-09
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2012-01-06
  • 2014-01-30
相关资源
最近更新 更多