26
六
SqlBulkCopy是.Net2.0之后就提供的一个类,经实测能实现W/S的写入速度,应该算是挺高效的,不亚于SQL Server的命令行工具 bcp,但如果你的数据源和目标表在同一个SQL Server 实例中,建议你使用T-SQL语句INSERT ... SELECT来完成数据复制工作。
SqlBulkCopy的具体使用方法,我就不介绍了,不喜欢贴代码,反正非常简单,参考MSDN即可,支持的写入数据源是DataRow ,DataTable ,IDataReader ,所以只要是能生成上面这几种数据对象的数据源都可以。
写几条注意事项吧:
1. SqlBulkCopy的类定义是:publie sealed class SqlBulkCopy : IDisposable ,所以用的时候别忘了using或最后调用dispose.
2. 如果数据源和目标表的字段顺序不一致或少于目标表的字段数,必须要设置ColumnMappings,即使字段名称一样也不行。
3.如果需要时间较长,请设置BulkCopyTimeout,单位秒,默认是30秒,设置连接串上的Timeout对此无效。
4.如果想实时了解复制进度,可以订阅SqlRowsCopied事件,并设置NotifyAfter属性,NotifyAfter属性指定完成多少行通知一次。
SqlBulkCopy的具体使用方法,我就不介绍了,不喜欢贴代码,反正非常简单,参考MSDN即可,支持的写入数据源是DataRow ,DataTable ,IDataReader ,所以只要是能生成上面这几种数据对象的数据源都可以。
写几条注意事项吧:
1. SqlBulkCopy的类定义是:publie sealed class SqlBulkCopy : IDisposable ,所以用的时候别忘了using或最后调用dispose.
2. 如果数据源和目标表的字段顺序不一致或少于目标表的字段数,必须要设置ColumnMappings,即使字段名称一样也不行。
3.如果需要时间较长,请设置BulkCopyTimeout,单位秒,默认是30秒,设置连接串上的Timeout对此无效。
4.如果想实时了解复制进度,可以订阅SqlRowsCopied事件,并设置NotifyAfter属性,NotifyAfter属性指定完成多少行通知一次。
5.支持事务,一种是SqlBulkCopy内部事务,通过在构造的时候指定SqlBulkCopyOptions.UseInternalTransaction选项即可,这个每完成一个Batch就会提交,失败的Batch不会影响已提交的。另一种就是连接级的事务,影响所有批次
6.设定BatchSize指定每批次提交行数,不设置默认为一次性提交
7.通过在构造函数中设置:SqlBulkCopyOptions.KeepIdentity ,可以保证Identity列值不变。同时设置多个选项,使用 | 运算符。
8.目标表仅限于 SQL Server tables.
8.目标表仅限于 SQL Server tables.
归类于:数据库 标签: SqlBulkCopy 大数据批量迁移
还没有评论!
-
第一个发布评论?
发表评论
