2013-10-01 26 views
16

Używam SqlBulkCopy wstawić dużej ilości danych:SqlBulkCopy - Nieoczekiwany istniejący transakcja

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; 
} 

Ale zawsze uzyskać wyjątek:

Unexpected existing transaction. 

Dlaczego ten wyjątek dzieje?

Odpowiedz

32

"Nieoczekiwana istniejąca transakcja" ... Dlaczego występuje ten wyjątek?

Dzieje się tak, ponieważ użycie konstruktora SqlBulkCopy bez określania transakcji spowoduje wewnętrzną wewnętrzną transakcję.

Unikaj tego, tworząc transakcję, a następnie użyj jej do utworzenia SqlBulkCopy. SqlBulkCopy mogą być tworzone z transakcją, który chcesz użyć, na przykład:

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

Niż to działa na mnie – andy

+0

dzięki, było pomocne! :) – Michael

4

Trzeba użyć the constructor that takes in the transaction tak SqlBulkCopy będą świadomi transakcji

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

czy istnieje konstruktor, który po prostu bierze połączenie i transakcję? Myślę, że brakuje Ci BulkCopyOptions – jltrem

+0

@jltrem dobry punkt, naprawiony. –