SqlBulkCopy - Transazione esistente imprevista

c# sqlbulkcopy sql-server sql-server-2008

Domanda

Sto usando SqlBulkCopy per inserire una grande quantità di dati:

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 accettata

"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.

Evita questo creando la tua transazione e poi SqlBulkCopy per creare SqlBulkCopy . SqlBulkCopy possibile creare SqlBulkCopy con la transazione che si desidera utilizzare, ad esempio:

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

Risposta popolare

È necessario utilizzare il costruttore che accetta la transazione in modo che SqlBulkCopy sia 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;

   }
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow