SqlBulkCopy - 意外的现有事务

本文关键字:事务 意外 SqlBulkCopy | 更新日期: 2023-09-27 18:33:23

我正在使用SqlBulkCopy插入大量数据:

try
{
   using (var bulkCopy = new SqlBulkCopy(connection))
   {
      connection.Open();
      using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
      {
          bulkCopy.DestinationTableName = "table";
          bulkCopy.ColumnMappings.Add("...", "...");                            
          using (var dataReader = new ObjectDataReader<MyObject>(data))
          {
              bulkCopy.WriteToServer(dataReader);
          }
          tran.Commit();
          return true;
      }
   }
}
catch (Exception ex)
{
    return false;
}

但我总是得到例外:

Unexpected existing transaction.

为什么会发生此异常?

SqlBulkCopy - 意外的现有事务

"意外的现有交易" ...为什么会发生此异常?

发生这种情况是因为在不指定事务的情况下使用 SqlBulkCopy 构造函数将在内部创建自己的事务。

通过创建事务,然后使用它来创建SqlBulkCopy来避免这种情况。 可以使用要使用的事务创建SqlBulkCopy,如下所示:

connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
    using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
    {

您需要使用接收事务的构造函数,以便 SqlBulkCopy 能够识别事务

connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
   using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
   {
       bulkCopy.DestinationTableName = "table";
       bulkCopy.ColumnMappings.Add("...", "...");                            
       using (var dataReader = new ObjectDataReader<MyObject>(data))
       {
          bulkCopy.WriteToServer(dataReader);
       }
       tran.Commit();
       return true;
   }
}