2013-10-01 10 views
16

Sto usando SqlBulkCopy di inserire grandi quantità di dati:SqlBulkCopy - Unexpected transazione esistente

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

ma ottengo sempre un'eccezione:

Unexpected existing transaction. 

Perché questa eccezione accade?

risposta

32

"Transazione esistente inattesa" ... Perché si verifica questa eccezione?

Ciò accade perché l'utilizzo del costruttore SqlBulkCopy senza specificare una transazione creerà la propria transazione internamente.

Evitare questo creando la transazione e quindi utilizzarla per creare lo SqlBulkCopy. SqlBulkCopy possono essere creati con l'operazione che si desidera utilizzare, in questo modo:

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

Thanx questo funziona per me – andy

+0

Grazie, è stato utile! :) – Michael

4

è necessario utilizzare the constructor that takes in the transaction così SqlBulkCopy sarà a conoscenza della transazione

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

c'è un costruttore che prende solo la connessione e la transazione? Penso che manchi BulkCopyOptions – jltrem

+0

@jltrem buon punto, corretto. –