从内存中直接将数据入库-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();
|
阅读(1739) | 评论(0) | 转发(0) |