3 votes

Apporter des modifications à la base de données uniquement si toutes les requêtes s'exécutent avec succès.

Je dois parfois supprimer deux enregistrements dans des tables différentes. Comment puis-je exécuter la requête de telle sorte que si l'une d'entre elles échoue, l'autre ne s'exécute pas et vice-versa. En d'autres termes, la base de données ne sera mise à jour que si les deux requêtes sont réussies, sinon aucune modification ne sera apportée. De cette façon, si je reçois des erreurs, je sais que rien n'a changé. J'exécute cette requête en C# comme suit :

//qDelete is a string containing the query
// connection - SqlConnection 

SqlCommand cmd = new SqlCommand(qDelete, connection);
try
{
    var t = cmd.ExecuteNonQuery();
    MessageBox.Show("Query succesfully executed \n \n" + "\n\n" + t + " records successfully deleted");
}
catch
{
    //do something here to avoid having any changes to the database          
}

C'est génial. Ma chaîne sDelete est construite dynamiquement et la seule chose qui me manque est de placer les déclarations dans le bon ordre. J'ai compris que je dois d'abord supprimer les enregistrements de la table dépendante ou de la table qui a des contraintes, puis de l'autre table. Comment puis-je voir quelle table dépend de l'autre ? Cela m'aidera à construire cette requête. Je pourrais faire quelque chose comme trier toutes les chaînes et placer celles qui contiennent la table qui n'a pas de contrainte en premier puis placer les autres. Comment puis-je savoir quelle table dépend de l'autre pour que cela soit encore mieux ?

4voto

KeithS Points 36130

La réponse est d'utiliser une Transaction. En utilisant la SqlConnection, commencez une Transaction en utilisant la méthode BeginTransaction() ; elle retournera une SqlTransaction. Ensuite, il existe une surcharge du constructeur SqlCommand qui prendra la transaction ainsi que la connexion. Exécutez la ou les commandes, et à la fin du bloc try, appelez la méthode Commit() sur la transaction. Si vous rencontrez une erreur, appelez Rollback() sur la transaction.

3voto

Kate Gregory Points 13451

Vous voulez utiliser un Transaction pour rassembler les deux mises à jour et les laisser soit réussir toutes les deux, soit ne pas réussir. Ce lien inclut un exemple qui fait deux insertions, mais vous pouvez facilement l'adapter pour deux suppressions.

2voto

Abdul Muqtadir Points 3887

Vous devez utiliser le support de transaction d'ADO.Net. Essayez

    private static void DemoFunc() 
       {
          SqlConnection conn = new SqlConnection("");//conection string here
          SqlTransaction transaction;
          SqlCommand cmd;

          conn.Open();
          transaction = conn.BeginTransaction();
          try 
          {
             cmd = new SqlCommand("Your Query1", conn, transaction);//Your query in place of Your Query1 
             cmd.ExecuteNonQuery();

             cmd = new SqlCommand("Your Query2", conn, transaction);//Your query in place of Your Query2         
 cmd.ExecuteNonQuery();
             transaction.Commit();
          } 
          catch (SqlException sqlError) 
          {
             transaction.Rollback();
          }
          conn.Close();
       }

1voto

FSBarker Points 76

Essayez ceci sur les transactions SQLCommand.

http://www.aspnet101.com/2010/07/working-with-ado-net-transactions/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X