none
DataSet Typé - Gestion des transactions RRS feed

  • Question

  • Bonjour,

    La société dans laquelle je travaille actuellement utilise des "DataSets Fortement Typés" avec des schémas .xsd pour la mise à jour des données.

    Je voulais savoir comment gérer les transactions dans ce cadre.

    D'ailleurs une question, est-ce que la commande AcceptChanges gère la transaction ou alors ce n'est pas le cas ?

    Faut-il écrire un gestionnaire particulier ? Si vous avez des exemples à me fournir.

    Merci


    Exemple  de ce qui est fait au niveau de chaque table mis à jour :

     try
                {
                    TypedDataset.PlanChasseTableAdapters.TM_PER_personneTableAdapter personne = new TypedDataset.PlanChasseTableAdapters.TM_PER_personneTableAdapter(database.ConnectionString);
                    personne.Update(per);
                    per.AcceptChanges();
                }
                catch (Exception e)
                {
                    per.RejectChanges();
                    throw new Exception("UpdateTM_PER", e);
                }



    • Modifié GRANET mardi 10 mars 2015 16:05
    mardi 10 mars 2015 16:00

Réponses

  • Bonjour,
    Pour la solution 1 voici comment vous pouvez l'implémenter :
    using (SqlConnection connection = new SqlConnection(database.ConnectionString))
    {
     connection.Open();
     
     using (var transac = connection.BeginTransaction())
     {
      try
      {
       TypedDataset.PlanChasseTableAdapters.TM_PER_personneTableAdapter personne = new TypedDataset.PlanChasseTableAdapters.TM_PER_personneTableAdapter(database.ConnectionString);
       personne.Update(per);
       per.AcceptChanges();
       
       transac.Commit();
      }
      catch (Exception e)
      {
       per.RejectChanges();
       transac.RollBack();
       throw new Exception("UpdateTM_PER", e);
      }
      finally
      {
       connection.Close();
      }
     }
    }

    Vous devrez en outre modifier votre constructeur de DataAdapter pour prendre en compte cette transaction :

    public TM_PER_personneTableAdapter(IDbTransaction transaction){
    	SqlDataAdapter adapter = // votre initialization
    	
    	adapter.InsertCommand.Connection = transaction.Connection;
    	adapter.UpdateCommand.Connection = transaction.Connection;
    	adapter.DeleteCommand.Connection = transaction.Connection;
    
    	adapter.InsertCommand.Transaction = transaction;
    	adapter.UpdateCommand.Transaction = transaction;
    	adapter.DeleteCommand.Transaction = transaction;
    }

    Cordialement,

    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Proposé comme réponse BEAUGRAND Kevin mercredi 11 mars 2015 12:28
    • Marqué comme réponse GRANET mercredi 11 mars 2015 15:32
    mercredi 11 mars 2015 10:34
  • Bonjour,

    AcceptChanges permet de mettre à jours le status des lignes (RowState) de vos dataTables. Cela n'effectue pas d'actions sur la base de données. C'est le Update qui se charge de faire les modifications en base de données mais cela ne créée pas de transaction.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse GRANET mercredi 11 mars 2015 15:32
    mercredi 11 mars 2015 14:17
  • Bonjour,

    Merci de ne pas oublier de marquer comme réponse, cela pourrais aider d'autres personnes.

    Cordialement,

    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse GRANET mercredi 11 mars 2015 15:32
    mercredi 11 mars 2015 15:11

Toutes les réponses

  • Bonjour,

    Pour traiter ce genre d'opérations avec des transactions, vous avez deux possibilités :

    Solution 1 :

    • Créer une transaction à partir de votre database (https://msdn.microsoft.com/en-us/library/732f7hzd(v=vs.110).aspx)
    • Vous devrez utiliser la même dbconnection dans toutes les opérations envoyées à vote base de données afin de garder cela consistant
    • Enfin vous pourrez valider la transaction ainsi créée à la fin de toutes les opérations (avant la fermeture de la connection)
    Solution 2 :

    La solution 1 est la plus performante mais peut vous obliger à pas mal de refactoring pour l'implémenter en fonction de comment l'implémentation est actuellement faite.

    En revanche la solution 2 est plus "lourde" et vous fera faire moins de modifications dans votre code (si vous travailler avec des threads asynchrones etc, cela peut être compliqué). Cependant vous serez contraint d'utiliser MSDTC sur les postes concernés (Celui qui exécute le code et celui qui héberge la base de données), impliquant des communications entre ces deux derniers, donc doits sur le réseaux, etc...

    Personnellement, je préconise l'utilisation de la première solution.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.


    mardi 10 mars 2015 20:08
  • Bonjour 

    Merci pour ce début de réponse, j'avais envisagé ces deux solutions mais est-ce que vous avez des exemples appliqués au DataSet fortement Typé  (notamment de la première solution) ?

    Est-ce la commande "AcceptChanges" lève une transaction en arrière plan ou ce n'est absolument pas le cas ?

    Cdt

    mercredi 11 mars 2015 08:31
  • Bonjour,
    Pour la solution 1 voici comment vous pouvez l'implémenter :
    using (SqlConnection connection = new SqlConnection(database.ConnectionString))
    {
     connection.Open();
     
     using (var transac = connection.BeginTransaction())
     {
      try
      {
       TypedDataset.PlanChasseTableAdapters.TM_PER_personneTableAdapter personne = new TypedDataset.PlanChasseTableAdapters.TM_PER_personneTableAdapter(database.ConnectionString);
       personne.Update(per);
       per.AcceptChanges();
       
       transac.Commit();
      }
      catch (Exception e)
      {
       per.RejectChanges();
       transac.RollBack();
       throw new Exception("UpdateTM_PER", e);
      }
      finally
      {
       connection.Close();
      }
     }
    }

    Vous devrez en outre modifier votre constructeur de DataAdapter pour prendre en compte cette transaction :

    public TM_PER_personneTableAdapter(IDbTransaction transaction){
    	SqlDataAdapter adapter = // votre initialization
    	
    	adapter.InsertCommand.Connection = transaction.Connection;
    	adapter.UpdateCommand.Connection = transaction.Connection;
    	adapter.DeleteCommand.Connection = transaction.Connection;
    
    	adapter.InsertCommand.Transaction = transaction;
    	adapter.UpdateCommand.Transaction = transaction;
    	adapter.DeleteCommand.Transaction = transaction;
    }

    Cordialement,

    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Proposé comme réponse BEAUGRAND Kevin mercredi 11 mars 2015 12:28
    • Marqué comme réponse GRANET mercredi 11 mars 2015 15:32
    mercredi 11 mars 2015 10:34
  • Merci beaucoup pour cet exemple qui cadre parfaitement à mon besoin. J'avais trouvé également une classe "Helper" qui permettait de positionner la transaction sur l'adapter pour les commandes INSERT, UPDATE, DELETE sans forcément modifier le constructeur de tous les "TableAdapter".

    Reste à rendre cela générique pour un ensemble de tables à mettre à jour.

    mercredi 11 mars 2015 11:27
  • Kevin,

    il me reste une question en suspend.

    Est-ce la commande "AcceptChanges" lève une transaction en arrière plan ou ce n'est absolument pas le cas ?

    Est-ce que vous pouvez m'éclairer sur le sujet ?

    Merci d'avance

    Cyril

    mercredi 11 mars 2015 13:53
  • Bonjour,

    AcceptChanges permet de mettre à jours le status des lignes (RowState) de vos dataTables. Cela n'effectue pas d'actions sur la base de données. C'est le Update qui se charge de faire les modifications en base de données mais cela ne créée pas de transaction.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse GRANET mercredi 11 mars 2015 15:32
    mercredi 11 mars 2015 14:17
  • Merci pour cette précision.

    Bonne journée.

    Cyril

    mercredi 11 mars 2015 14:56
  • Bonjour,

    Merci de ne pas oublier de marquer comme réponse, cela pourrais aider d'autres personnes.

    Cordialement,

    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse GRANET mercredi 11 mars 2015 15:32
    mercredi 11 mars 2015 15:11