c# - 百万插入 : SqlBulkCopy timeout

标签 c# sql-server bulkinsert sqldatareader sqlbulkcopy

我们已经有一个可以处理所有连接字符串的运行系统(db2oracleMSServer)。

目前,我们正在使用 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相关的超时问题。

我在代码中做错了什么吗?

最佳答案

您能否尝试在调用 WriteToServer 之前添加以下内容...

bc.BatchSize = 10000;
bc.BulkCopyTimeout = 0;

我不知道默认的批量大小或超时是多少,但我怀疑这可能是您的问题。 希望有帮助

此外,您可以尝试使用不同的批量大小以获得最佳性能。

关于c# - 百万插入 : SqlBulkCopy timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27385981/

相关文章:

c# - 将可变长度结构转换为 byte[]

c# - 如何对数据集运行查询

c# - 具有列映射的 MySqlBulkLoader?

sql-server - 批量上传: "unexpected end of file" on new server

C# 格式字符串 "# ### ###.##"小于 1 时缺少零

c# - 将 Lambda 函数传递给 Xamarin.Android 绑定(bind)库中的 Kotlin 的 C# 生成代码

sql-server - 相当于 SQL Server 的 Debug.Assert

sql-server - 排序依据和大小写

sql - 根据两列查找重复记录

c# - 批量插入数据表到 MS Access (MS Excel) 数据库 (C#)