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