SqlBulkCopy 是个好对象(转)
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 我就不放这里挺碍眼的.
在我的机器上的测试结果如下.