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.

Почему это исключение происходит?


person 1110    schedule 01.10.2013    source источник


Ответы (2)


«Неожиданная существующая транзакция»... Почему происходит это исключение?

Это происходит потому, что использование конструктора SqlBulkCopy без указания транзакции создаст внутреннюю транзакцию.

Чтобы избежать этого, создайте свою транзакцию, а затем используйте ее для создания файла SqlBulkCopy. SqlBulkCopy можно создать с транзакцией, которую вы хотите использовать, например:

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

Вам нужно использовать конструктор, который принимает транзакцию, поэтому 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;

   }
}
person Scott Chamberlain    schedule 01.10.2013
comment
есть ли конструктор, который просто принимает соединение и транзакцию? Я думаю, вам не хватает BulkCopyOptions - person jltrem; 01.10.2013