我们已经有一个运行中的系统,处理所有连接字符串(db2、oracle、MSServer)。
目前,我们正在使用ExecuteNonQuery()
进行一些插入操作。
我们想通过使用SqlBulkCopy()
而不是ExecuteNonQuery()
来提高性能。我们有一些客户端拥有超过5000万条记录。
我们不想使用SSIS,因为我们的系统支持多个数据库。
我创建了一个示例项目来测试SqlBulkCopy()
的性能。我为MSServer创建了一个简单的读取和插入函数。
以下是这个小函数:
public void insertIntoSQLServer()
{
using (SqlConnection SourceConnection = new SqlConnection(_sourceConnectionString))
{
//Open the connection to get the data from the source table
SourceConnection.Open();
using (SqlCommand command = new SqlCommand("select * from " + _sourceSchemaName + "." + _sourceTableName + ";", SourceConnection))
{
//Read from the source table
command.CommandTimeout = 2400;
SqlDataReader reader = command.ExecuteReader();
using (SqlConnection DestinationConnection = new SqlConnection(_destinationConnectionString))
{
DestinationConnection.Open();
//Clean the destination table
new SqlCommand("delete from " + _destinationSchemaName + "." + _destinationTableName + ";", DestinationConnection).ExecuteNonQuery();
using (SqlBulkCopy bc = new SqlBulkCopy(DestinationConnection))
{
bc.DestinationTableName = string.Format("[{0}].[{1}]", _destinationSchemaName, _destinationTableName);
bc.NotifyAfter = 10000;
//bc.SqlRowsCopied += bc_SqlRowsCopied;
bc.WriteToServer(reader);
}
}
}
}
}
当我的dummyTable记录少于200,000条时,批量复制功能正常工作。但是,当记录超过200,000条时,我会遇到以下错误:
- 试图在具有未完成操作的对象上调用批量复制。
或者
- 等待操作超时(对于IDataReader)
我增加了阅读器的CommandTimeout。它似乎已解决与IDataReader相关的超时问题。
我的代码有什么问题吗?