SqlBulkCopy - Transaction existante inattendue

c# sqlbulkcopy sql-server sql-server-2008

Question

J'utilise SqlBulkCopy pour insérer une grande quantité de données:

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

Mais je reçois toujours une exception:

Unexpected existing transaction.

Pourquoi cette exception se produit?

Réponse acceptée

"Transaction existante inattendue" ... Pourquoi cette exception se produit?

Cela est dû au fait que l'utilisation du constructeur SqlBulkCopy sans spécifier de transaction créera sa propre transaction en interne.

Évitez cela en créant votre transaction, puis utilisez-la pour créer le SqlBulkCopy . SqlBulkCopy peut être créé avec la transaction que vous souhaitez utiliser, comme ceci:

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

Réponse populaire

Vous devez utiliser le constructeur qui accepte la transaction pour que SqlBulkCopy soit informé de la transaction.

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;

   }
}


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi