1.什么是SqlbulkCopy,解决的问题
在程序处理中经常会遇见大数据量的批量操作,比如我们要把一个文本格式的数据批量插入数据库。如果按照传统的逻辑只会将从文件中读出的数据以轮询的方式一条一条的插入到目标数据库里面,这样反复连接打开数据库执行插入命令效率极其低下。所以很多程序在处理这样的插入操作的时候都是在半夜用户低风期处理,以免影响正常用户的使用。
.Net Framework提供的SqlbulkCopy函数就可以将原来一条一条处理的数据进行批量处理,不需要在一条一条的长时间处于一件插入的操作了。
2.SqlbulkCopy使用方法
SqlbulkCopy,首先我们需要获取到源数据源,然后连接到目标数据库建立SqlbulkCopy对应视图,最后执行插入命令。瞬间就能插入百万条数据到SqlServer数据库里面去。
2.1获取数据源数据
获取数据源数据这个可能是一个长时间的过程,因为我们的数据源来自多种类型比如,数据库、扁平文件、接口数据等等各种各样。具体的获取数据根据具体数据源需要制定解决方案。
2.2 连接到目标数据库
这里的SqlbulkCopy,我只用来向SqlServer数据库里面批量写入数据。能否向Oracle数据库写入数据还需要具体的研究。
2.3 建立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所占用的内存主动释放,然后再去处理下一个数据源。