dapper批量插入

本文介绍如何使用DapperExtensions库实现批量插入功能。通过具体代码示例,展示了配置数据库连接、事务处理及利用SqlBulkCopy进行高效批量写入的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要用到DapperExtensions库,上码:

 /// <summary>
        /// 批量插入功能
        /// </summary>
        public void InsertBatch<T>(IDbConnection conn, IEnumerable<T> entityList, IDbTransaction transaction = null) where T : class
        {
            var tblName = string.Format("dbo.{0}", typeof(T).Name);
            var tran = (SqlTransaction)transaction;
            using (var bulkCopy = new SqlBulkCopy(conn as SqlConnection, SqlBulkCopyOptions.TableLock, tran))
            {
                bulkCopy.BatchSize = entityList.Count();
                bulkCopy.DestinationTableName = tblName;
                var table = new DataTable();
                DapperExtensions.Sql.ISqlGenerator sqlGenerator = new SqlGeneratorImpl(new DapperExtensionsConfiguration());
                var classMap = sqlGenerator.Configuration.GetMap<T>();
                var props = classMap.Properties.Where(x => x.Ignored == false).ToArray();
                foreach (var propertyInfo in props)
                {
                    bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
                    table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyInfo.PropertyType) ?? propertyInfo.PropertyInfo.PropertyType);
                }
                var values = new object[props.Count()];
                foreach (var itemm in entityList)
                {
                    for (var i = 0; i < values.Length; i++)
                    {
                        values[i] = props[i].PropertyInfo.GetValue(itemm, null);
                    }
                    table.Rows.Add(values);
                }
                bulkCopy.WriteToServer(table);
            }
        }
另可参考: http://www.lanhusoft.com/Article/26.html
DapperExtensions的地址: https://github.com/tmsmith/Dapper-Extensions



### Dapper 批量插入多条记录的实现 在 C# 开发中,`Dapper` 是一种轻量级的对象关系映射工具,能够高效执行 SQL 查询和命令。对于批量插入操作,可以通过 `Dapper` 的扩展功能来完成。 以下是基于 `Dapper` 实现批量插入的一个典型示例: #### 方法一:通过 Execute 方法传递集合 可以直接利用 `Dapper` 提供的 `Execute` 方法,并将数据集合作为其参数之一传入。这种方式适用于简单的批量插入场景[^2]。 ```csharp using (var connection = new SqlConnection("YourConnectionString")) { var data = new List<YourModel> { new YourModel { Column1 = value1, Column2 = value2 }, new YourModel { Column1 = value3, Column2 = value4 } }; string sql = "INSERT INTO TableName (Column1, Column2) VALUES (@Column1, @Column2)"; int rowsAffected = await connection.ExecuteAsync(sql, data); } ``` 上述代码片段展示了如何定义一个模型列表并将其作为参数传递给 `Dapper` 的 `ExecuteAsync` 方法。每一条记录都会按照指定的 SQL 语句逐一插入到目标表中。 --- #### 方法二:借助 SqlBulkCopy 和自定义适配器 如果需要更高效的性能处理大规模的数据插入,则可以考虑结合 ADO.NET 中的 `SqlBulkCopy` 类与 `Dapper` 进行协作[^1]。虽然这不是纯 `Dapper` 解决方案,但在某些情况下可能是最佳实践。 以下是一个混合使用的例子: ```csharp using System.Data.SqlClient; using Dapper; public async Task BulkInsertWithDapperAndSqlBulkCopy(List<YourModel> dataList) { using (var connection = new SqlConnection("YourConnectionString")) { await connection.OpenAsync(); using (var bulkCopy = new SqlBulkCopy(connection)) { bulkCopy.DestinationTableName = "TableName"; // 映射字段名称 bulkCopy.ColumnMappings.Add("Column1", "DatabaseColumnName"); bulkCopy.ColumnMappings.Add("Column2", "AnotherDatabaseColumnName"); // 将数据加载至 DataTable 或其他兼容结构 var dataTable = ConvertToDataTable(dataList); // 启动批量化复制过程 await bulkCopy.WriteToServerAsync(dataTable); } } } private DataTable ConvertToDataTable(IEnumerable<YourModel> list) { var table = new DataTable(); table.Columns.Add("Column1", typeof(string)); table.Columns.Add("Column2", typeof(int)); foreach (var item in list) { table.Rows.Add(item.Column1, item.Column2); } return table; } ``` 这种方法充分利用了 `SqlBulkCopy` 高效的优势,同时保留了部分 `Dapper` 的灵活性。 --- #### 性能优化建议 当面对极大量的数据插入需求时(例如百万级别),应特别注意以下几个方面: - **事务管理**:确保所有插入操作在一个事务范围内完成,减少单次提交带来的开销。 - **分批次处理**:避免一次性加载过多内存中的对象实例,采用合理的分页策略逐步上传数据[^4]。 - **索引调整**:临时禁用不必要的非聚集索引来加速写入速度,在完成后重新启用它们。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值