惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Martin Fowler
Martin Fowler
Last Week in AI
Last Week in AI
罗磊的独立博客
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
博客园_首页
人人都是产品经理
人人都是产品经理
量子位
美团技术团队
The Cloudflare Blog
小众软件
小众软件
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
博客园 - Franky

博客园 - Franz

从如此简单的代码谈起 谈谈C#基元类型 TFS代码签入指导 并发之阿喀琉斯之踵 SmallDateTime时间范围检查 too many automatic redirections were attempted 预览Cube出现没有注册类错误 Transaction Manager Maximum Timeout .NET下的延迟加载 我的VisualStudio工具箱 简单的谈一下.NET下的AOP TFS上使用Beyond Compare来比较源码 释放Sql Server内存 吐槽一下Silverlight的SaveFileDialog. 书评《模式-工程化实现及扩展》 定义加载动画 代码共享的小技巧 WPF将控件保存为图片 《编程人生》的书评
SqlBulkCopy 是个好对象
Franz · 2013-04-08 · via 博客园 - Franz

2013-04-08 11:17  Franz  阅读(1922)  评论()    收藏  举报

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 我就不放这里挺碍眼的.

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