寻求快速的数据库数据插入方法

最近碰到棘手的问题,在我手里有上万条数据,不算多吧,但是在从oracle数据库中取出来再往Access中插入的时候,一个6000多条记录的读取加写入,花了7分钟,实在是不能忍受。在2类数据库之间导小数据量的时候没有发现速度是个问题,现在尝到苦果了啊。

之前的思路:执行Sql语句,取出源数据存放在DataSet中,然后再遍历DataSet中的Table,一行一行的往目标数据库中插入,期间还要判断目标数据库表中是否存在该条记录,如果存在,就更新不存在就插入。由于历史遗留问题,有些表中没有设置主键,需要2个或者3个字段才能唯一确定一条记录,拼接条件语句,判断是否存在,然后再给目标表结构赋值,将表结构解析成Insert语句,插入数据.每条记录都要有这么步骤要处理,现在觉得不慢才怪咧。

所以要改进,先看看一个方便简单的例子,.net自带一个用来往Sql Server中导入数据的SqlBulkCopy类,提供了一个方法WriteToServer ,这个速度、性能好像还不错,使用方法去看看MSDN就明白了。我在源表中放了1W多条记录,写到另一个数据库的表中花了23s左右。不过WriteToServer 会使连接繁忙,在它运行结束之前它的对数据库的连接一直处于运行状态,因此不能在此连接上执行其他操作。

using(System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection())

{

conn.ConnectionString = @"Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sa";

string cmdText = "SELECT * FROM SourceTable";

conn.Open();

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(cmdText, conn);
System.Data.SqlClient.SqlDataReader reader;
reader = cmd.ExecuteReader();
string sqlConstr = "Data Source=.;Initial Catalog=AdventureWorks;User ID=sa;Password=sa;";
using (System.Data.SqlClient.SqlBulkCopy o = new System.Data.SqlClient.SqlBulkCopy(sqlConstr))
{
     o.DestinationTableName = "TargetTable";
     o.WriteToServer(reader);

}

reader.Close();

conn.Close();

}


WriteToServer(array<DataRow>[]()[])

    将所提供的 DataRow 数组中的所有行复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。

WriteToServer(DataTable)

    将所提供的 DataTable 中的所有行复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。

WriteToServer(IDataReader)

     将所提供的 IDataReader 中的所有行复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。

WriteToServer(DataTable, DataRowState)

    只将与所提供 DataTable 中所提供行状态匹配的行复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。

遗憾的是这个类只能用于用其他源的数据批量加载到 SQL Server 的表中,不能用于Oracle或者Access等其他类型数据库中。怀疑是不是微软为了方便基于其他数据库的应用迁移到Sql Server上面来而写的一个类。要想在其它类型数据库中实现高效率的数据批量加载,该怎么处理还是要费一番功夫的。

My Tags:大量数据操作 , Sql Server数据导入

原文地址:https://www.cnblogs.com/bluesky4485/p/1531763.html