Comment renvoyer le résultat après bulkCopy.WriteToServer

c# sqlbulkcopy sql-server sql-server-2008

Question

MISE À JOUR basée sur la réponse acceptée:

bool success = false;
using (var bulkCopy = new SqlBulkCopy(connection)) //using!
{
    connection.Open();

    //explicit isolation level is best-practice
    using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
    {
        bulkCopy.DestinationTableName = "table";
        bulkCopy.ColumnMappings...

        using (var dataReader = new ObjectDataReader<SomeObject>(paths))
        {            
            bulkCopy.WriteToServer(dataReader);
            success = true;
        }

        tran.Commit(); //commit, will not be called if exception escapes
    }
}
return success;

BulkCopy classe BulkCopy pour les grandes insertions et cela fonctionne bien.
Après avoir exécuté WriteToServer et enregistré les données dans la base de données
Je ne sais pas si toutes les données ont été sauvegardées avec succès afin de pouvoir renvoyer true/false parce que je dois tout ou rien sauvegarder?

    var bulkCopy = new SqlBulkCopy(connection);

    bulkCopy.DestinationTableName = "table";

    bulkCopy.ColumnMappings...

    using (var dataReader = new ObjectDataReader<SomeObject>(paths))
    {
        try
        {
        bulkCopy.WriteToServer(dataReader);
        }
        catch(Exception ex){ ... }    
}

Réponse acceptée

Si l'appel de WriteToServer terminé sans exception, toutes les lignes ont été enregistrées et sont sur le disque. Ceci est juste la sémantique standard pour SQL Server DML. Rien de spécial avec la copie en vrac.

Comme tous les autres DML, SqlBulkCopy est tout ou rien. Sauf si vous configurez une taille de lot que vous n'avez pas.

using (var bulkCopy = new SqlBulkCopy(connection)) //using!
{
    connection.Open();

    //explicit isolation level is best-practice
    using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
    {
        bulkCopy.DestinationTableName = "table";
        bulkCopy.ColumnMappings...

        using (var dataReader = new ObjectDataReader<SomeObject>(paths))
        {
            //try
            //{
            bulkCopy.WriteToServer(dataReader, /*here you set some options*/);
            //}
            //catch(Exception ex){ ... } //you need no explicit try-catch here
        }

        tran.Commit(); //commit, will not be called if exception escapes
    }
}

Je vous ai ajouté un exemple de code que j'ai aligné sur les meilleures pratiques.


Réponse populaire

Il n’existe aucun moyen direct d’identifier si le processus a abouti ou non, mis à part la recherche / interception des exceptions WriteToServer() par la méthode WriteToServer() .

Une autre solution consiste à vérifier le nombre d'enregistrements dans la base de données, puis le nombre d'enregistrements une fois le processus terminé - la différence étant le nombre inséré. La comparaison de cette valeur avec le nombre d'enregistrements à insérer peut donner une idée de l'échec ou du succès. Toutefois, cela n’est pas infaillible, en particulier s’il existe un autre processus d’insertion / suppression d’enregistrements.

Cependant, ces techniques associées à TransactionScope - http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx - ou quelque chose de similaire devraient donner les résultats escomptés.

MODIFIER

Par défaut, chaque opération d'insertion est traitée comme un lot. si l'opération échoue dans un lot particulier, ce dernier est annulé et non inséré avant.

Toutefois, si une transaction interne est appliquée à l'opération en bloc, un échec sur une ligne peut annuler l'ensemble des résultats. Par exemple;

using (SqlBulkCopy bulkCopy =
   new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity
                   | SqlBulkCopyOptions.UseInternalTransaction))
{
   bulkCopy.BatchSize = 10;
   bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns";

   try
   {
      bulkCopy.WriteToServer(reader);
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
   finally
   {
      bulkCopy.Close();
   }
}

Une erreur dans l’une des opérations ci-dessus entraînerait l’annulation complète de l’opération. Voir plus de détails à ce sujet sur http://msdn.microsoft.com/en-us/library/tchktcdk.aspx .



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