代码改变世界

SqlBulkCopy 是个好对象

2013-04-08 11:17  Franz  阅读(1899)  评论(7编辑  收藏  举报

SqlBulkCopy是专门用作大数据的导入的, 相比单条的Insert看起来要爽的多. 据说能相差几十倍的性能差距(我们稍后自己做一下测试)

微软关于SqlBulkCopy给出的信息如下

Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

具体可参考(http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlbulkcopy(v=vs.80).aspx)

SqlBulkCopy.WriteToServer 方法有一下重载:

名称说明
SqlBulkCopy.WriteToServer (DataRow[]) 将所提供的 DataRow 数组中的所有行复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。
SqlBulkCopy.WriteToServer (DataTable) 将所提供的 DataTable 中的所有行复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。
SqlBulkCopy.WriteToServer (IDataReader) 将所提供的 IDataReader 中的所有行复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。
SqlBulkCopy.WriteToServer (DataTable, DataRowState) 只将与所提供 DataTable 中所提供行状态匹配的行复制到 SqlBulkCopy 对象的DestinationTableName 属性指定的目标表中。

我们如果使用此方式添加自己的ORM插入逻辑岂不是一件很爽的事情. 从接口上看可以提供IDataReader方式或者DataTable, DataRow. 我们做的只是要将我们对象适配到这些对象上去就好了. 具体选择哪种方式去做呢?

方式一: DataTable, DataRow的方式是通过反射将所对象上的所有属性都塞到DataTable, DataRow中. 然后传递给SqlBulkCopy.WriteToServer方法.

方式二: 适配层实现IDataReader接口, 然后根据需要将具体的属性反射出来. (为何是根据需要才反射呢? 具体看参考一下IDataReader接口上的object GetValue(int i)方法)

显然方式二更好些.

 

具体的代码直接下载着看吧. https://files.cnblogs.com/cuiweifu/OrmForSqlBulkCopy.zip 我就不放这里挺碍眼的.

在我的机器上的测试结果如下.