C#批量数据处理SqlBulkCopy
时间:2022-03-10 17:36
1.什么是SqlbulkCopy,解决的问题
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(trans.Connection, SqlBulkCopyOptions.KeepIdentity, trans)) { bulkCopy.BatchSize = 100000; bulkCopy.BulkCopyTimeout = 1800; //将DataTable表名作为待导入库中的目标表名 bulkCopy.DestinationTableName = destinationTable; //将数据集合和目标服务器库表中的字段对应 for (int i = 0; i < sourceTable.Columns.Count; i++) { //列映射定义数据源中的列和目标表中的列之间的关系 //bulkCopy bulkCopy.ColumnMappings.Add(sourceTable.Columns[i].ColumnName, sourceTable.Columns[i].ColumnName); } //SqlBulkCopyMapping(bulkCopy); try { bulkCopy.WriteToServer(sourceTable); trans.Commit(); } catch (Exception ex) { Console.WriteLine(ex.Message); trans.Rollback(); } }
以上的代码指定了每一次插入数据库的数据量的大小为100000条,每一次插入数据的最大时间为1800毫秒,并且指定了插入的目标表名称。由于在插入过程中可能会有失败,我们为了保证插入数据的完整性,在插入过程中带上数据库事务。只有在完全插入之后提交事务,插入操作成功。
由于我们把数据源组织成为DataTable的所以我们可以通过
bulkCopy.ColumnMappings.Add(sourceTable.Columns[i].ColumnName, sourceTable.Columns[i].ColumnName);来建立DataTable和数据库里面字段之间的对应关系——通过字段名称进行对应的。最后一步通过bulkCopy.WriteToServer(sourceTable);就可以把数据源数据sourceTable插入到数据库里面了。
3.SqlbulkCopy需要注意的性能问题
在使用SqlbulkCopy中需要注意的问题,要把某个数据源批量插入数据库,首先需要把这个数据源完全加载到内存之中,然后进行插入操作,这样就会占用大量的内存,如果在进行下一次插入操作的时候没有释放内存中的数据那么整个机器的运行效率会被严重的拖慢,所以建议把源数据加载成为DataTable格式然后进行插入操作之后将这个DataTable所占用的内存主动释放,然后再去处理下一个数据源。
C#批量数据处理SqlBulkCopy,布布扣,bubuko.com