SqlBulkCopy - 意外的现有事务

26

我正在使用 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.

为什么会发生这个异常?

2个回答

52

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

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

通过创建您自己的事务,然后使用它来创建 SqlBulkCopy 来避免此问题。可以像这样使用想要使用的事务来创建 SqlBulkCopy

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

7
你需要使用带有事务的构造函数,以便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;

   }
}

2
有没有一个只需要连接和事务的构造函数?我认为你缺少了BulkCopyOptions。 - jltrem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接