Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165923
  • 博文数量: 36
  • 博客积分: 2160
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 01:48
个人简介

喝喝咖啡,做做开发

文章分类
文章存档

2014年(4)

2013年(1)

2012年(4)

2011年(2)

2010年(3)

2009年(9)

2008年(3)

2007年(10)

我的朋友

分类: 嵌入式

2007-11-14 11:36:55

从内存中直接将数据入库-SqlBulkCopy
作者: 山东人在成都
 
    在.Net framework 1.1中,当需要将内存中的数据直接导入数据库而不经过硬盘的存储,只有一行一行的构建INSERT语句,利用SqlCommand.ExecuteNonQuery方法提交数据. 这样做速度将是最大的限制, 因为每进行一次提交,数据库都将对其进行日志记录,也就是说提交5000行数据,数据库的日志会对5000行数据都进行记录,这大大延缓了数据入库的时间.
    微软的TSQL提供了一个大批量数据入库的SQL语句:BULK INSERT,虽然这个语句确实能很快的将数据导入到数据库,并且日志系统也只会记录一次,但是它必须要从硬盘存储中调用数据文件.如果数据库和数据文件所在的主机并非一台,可能就会有问题产生了,因为BULK INSERT调用另一台主机中的数据文件,是通过共享的方式,两台主机具有相同的登录名和密码,执行可以通过,前提是数据文件所在主机要开放共享. 如果两台主机登录名不同或者密码不同,BULK INSERT将会产生一个无法加载数据文件的错误报告.
    如果数据从内存中加载,问题也将不复存在,所需要的仅仅是到数据库的一个连接.在.Net framework 2.0k, 微软提供了一个类,从而让从内存中进行批量数据的导入成为现实. 该类为:SqlBulkCopy, 存在于System.Data.SqlClient命名空间,但它只能用于向SQL SERVER数据库表中写数据.SqlBulkCopy需要提供DataTable实例或者IDataReader实例.
下面举个例子, 可以说very easy.
 

DataSet ds = new DataSet();
//装载数据

...
//创建一个DataTable对象的实例

DataTable dt = ds[0];
SqlConnection cn = new SqlConnection("....");
cn.Open();

//执行批量数据入库

SqlBulkCopy bulkCopy = new SqlBulkCopy(cn);
bulkCopy.DestinationTableName = "指定的目标表";
bulkCopy.WriteToServer(dt);

bulkCopy.Close();
cn.Close();

阅读(1719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~