在生产应用程序中使用SqlBulkInsert

时间:2012-01-06 18:29:32

标签: c# sql database bulkinsert sqlbulkcopy

我们目前正在开发一个应用程序,在每个用户会话的特定表中生成超过5-10,000行数据。目前我们使用sql text命令一次插入每行数据,因此保存操作可能需要一分钟。我们正在使用SqlBulkInserts并且已经看到时间下降到不到500ms。有没有人反对在生产应用程序中使用SqlBulkInserts,许多用户将使用该系统?

3 个答案:

答案 0 :(得分:6)

我从未遇到过使用tableLock选项设置SqlBulkCopy的问题,而另一个用户因此被阻止。 TableLock选项可以提高插件的效率,而不是很多人所说过的,只是简单地使用它就可以看到我。

我的典型方法:

public void Bulk(String connectionString, DataTable data, String destinationTable)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        using (SqlBulkCopy bulkCopy =
            new SqlBulkCopy
            (
            connection,
            SqlBulkCopyOptions.TableLock |
            SqlBulkCopyOptions.FireTriggers |
            SqlBulkCopyOptions.UseInternalTransaction,
            null
            ))
        {
            bulkCopy.BatchSize = data.Rows.Count;
            bulkCopy.DestinationTableName = String.Format("[{0}]", destinationTable);
            connection.Open();
            bulkCopy.WriteToServer(data);
        }
    }
}

答案 1 :(得分:2)

在使用SqlBulkInsert实现之前,请尝试动态创建INSERT查询,如下所示:

insert into MyTable (Column1, Column2)
select 123, 'abc'
union all
select 124, 'def'
union all
select 125, 'yyy'
union all
select 126, 'zzz'

这只是一个数据库调用,它应该运行得更快。对于SQL字符串连接,请确保使用StringBuilder类。

答案 2 :(得分:1)

如果您的应用程序确实需要在每个会话中生成那么多记录,我认为这是正确的方法。