MSSql Server 批量插入数据优化

本文介绍使用.NET Framework中的SqlBulkCopy类进行批量数据插入的方法。通过示例代码展示了如何利用SqlBulkCopy实现高效的数据批量导入,并提供了注意事项以避免常见错误。

 

    针对批量入库, .Net Framework  提供了一个批量入库Class : SqlBulkCopy , 批量入库性能不错,经测试 四万左右数据 2秒入库。

   

    以下是测试Demo , 使用外部传入事务 tran , 后续 将多个操作挂在同一个tran 上 , 便于回退。

 

    需要注意几点:

  1. 最好显示指定列映射关系,否则SqlBulkCopy 中按照顺序索引映射,意外可能发生。

  2. 若连接对象通过 SqlTransaction tran =  conn.BeginTransaction() 开启事务,接下来 , 基于该连接查询,或修改操作均需要关联 tran .  如  sqlCommand.Transaction = tran

  3. 一个SqlCommand 关联一条Sql , 多条 Sql 创建多个Sqlcommand。

 

                        LogHelper.WriteMes(LogLevel.Core, "PDES.CORE", title, string.Format("预计批量插入数据行数:{0}", lstInsert.Count));

                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran))
                        {
                            //入库超时时间 20 分钟
                            bulkCopy.BulkCopyTimeout = 20 * 60;

                            //添加列映射
                            foreach (KeyValuePair<string, DataMapPairEntity> p in pair.ColumnMaps) {
                                bulkCopy.ColumnMappings.Add(p.Value.TARGET_COLUMN_NAME, p.Value.TARGET_COLUMN_NAME);
                            }
                            

                            bulkCopy.DestinationTableName = TableName;
                            bulkCopy.WriteToServer(lstInsert.ToArray());
                        }

                        LogHelper.WriteMes(LogLevel.Core, "PDES.CORE", title, string.Format("结束批量插入数据行数:{0}", lstInsert.Count));

 

 一个数据库连接开启事务后,基于该连接 数据库操作若未启用相关事务 , 报异常如图:

 

转载于:https://www.cnblogs.com/a_bu/p/7872840.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值