使用 Dapper 插入多行

Insert many rows with Dapper

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

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

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

我有更好的选择吗?

同意 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);
        }
    }

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


免责声明:我是项目的所有者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);