SqlBulkCopy - 意外的现有事务

时间:2013-10-01 13:11:10

标签: c# sql-server sql-server-2008 sqlbulkcopy

我正在使用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 个答案:

答案 0 :(得分:37)

  

“意外的现有交易”......为什么会发生这种异常?

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

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

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

答案 1 :(得分:4)

您需要使用the constructor that takes in the transaction,以便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;

   }
}