Partage
  • Partager sur Facebook
  • Partager sur Twitter

ROLLBACK MySQL C#

Sujet résolu
    2 décembre 2019 à 12:26:17

    Pourquoi ce bout de code ne rollback pas la requête SQL :

    MySqlTransaction tr;
                    tr = db.getConnection().BeginTransaction();
    
                    MySqlCommand cmdUpdateProduit = new MySqlCommand();
    
    
                    cmdUpdateProduit.Connection = db.getConnection();
    
                    cmdUpdateProduit.Transaction = tr;
                    //Modifie le produit
                    cmdUpdateProduit.CommandText = "UPDATE ...";
                    cmdUpdateProduit.ExecuteNonQuery();
                    tr.Rollback();


    Donc la requête ci-dessus ne devrait pas enregistrer les modifications apportées par l'UPDATE mais elle le fait quand même.

    • Partager sur Facebook
    • Partager sur Twitter
      11 décembre 2019 à 11:31:48

      Salut,

      Quel est le type de "db" ?

      A froid, je dirai que l'appel à db.getConnection() te renvoi une nouvelle connexion à chaque fois, et donc que l'objet Connection de ta transaction et l'objet Connection de commande ne sont pas les mêmes.

      Mais ca je ne pourrai pas te le certifier tant que tu ne donneras pas le type de "db"

      • Partager sur Facebook
      • Partager sur Twitter
        15 décembre 2019 à 15:59:31

        Le type est DbConnect, une classe que j'ai créée. Voici le constructeur ainsi que la fonction getConnection() :

        private MySqlConnection connection;
        
        public DbConnect()
                {
                    server = "server";
                    database = "test";
                    uid = "user";
                    password = "1234";
        
                    string connectionString;
                    connectionString = "SERVER=" + server + ";" + "DATABASE=" +
                    database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + "; ";
        
                    //Instancie la connexion
                    connection = new MySqlConnection(connectionString);
        
                }
        
                /// <summary>
                /// Retourne la connexion instanciée
                /// </summary>
                /// <returns></returns>
                public MySqlConnection getConnection()
                {
                    return connection;
                }


        La seule fois où j'ouvre une connexion c'est lors de l'ouverture de la fenêtre d'accueil. Voici la fonction qui "ouvre" une connexion :

         public bool OpenConnection()
                {
                    try
                    {
                        connection.Open();
                        return true;
                    }
                    catch (MySqlException ex)
                    {
                        //When handling errors, you can your application's response based 
                        //on the error number.
                        //The two most common error numbers when connecting are as follows:
                        //0: Cannot connect to server.
                        //1045: Invalid user name and/or password.
                        switch (ex.Number)
                        {
                            case 0:
                                MessageBox.Show("Imposible de se connecter au serveur. L'application va se fermer.");
                                break;
        
                            case 1045:
                                MessageBox.Show("Utilisateur ou mot de passe incorrect(s). L'application va se fermer.");
                                break;
                            default:
                                MessageBox.Show("Une erreur s'est produite, l'application va se fermer");
                                break;
                        }
                        return false;
                    }
                }



        • Partager sur Facebook
        • Partager sur Twitter
          16 décembre 2019 à 9:57:52

          >La seule fois où j'ouvre une connexion c'est lors de l'ouverture de la fenêtre d'accueil.

          Vous vous faites chier pour rien et c'est même contre-productif (cf. pooling de connexion de .NET).

          Ouvrez la connexion le plus tard possible et fermez-la le plus tôt possible.

          P.S.: il est où le "EndTransaction" ?

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            17 décembre 2019 à 11:47:23

             using (DbConnect con = new DbConnect())
                        {
                            List<int> liste = new List<int>();
                            con.OpenConnection();
                            MySqlCommand com = new MySqlCommand("SELECT * FROM t_adresse",con.getConnection());
                            MySqlDataReader data = com.ExecuteReader();
            
                            while (data.Read())
                            {
                                liste.Add((int)data["idAdresse"]);
                            }
            con.CloseConnection();
            }
            Bon ce n'est pas vraiment le sujet de ma question mais j'ai pris note de votre remarque. Est-ce plus correct d'utiliser les connexion à la base comme ceci ?
            Et concernant le EndTransaction, on utilise soit COMMIT ou soit ROLLBACK, il n'y a pas de méthode EndTransaction non ?

            -
            Edité par AnthonyDalMaso 17 décembre 2019 à 11:47:43

            • Partager sur Facebook
            • Partager sur Twitter
              17 décembre 2019 à 16:38:53

              Les DataReader, c'est caca, les DataAdapter, c'est la vie.

              Bien, l'usage de "using(...){...}", mais pas besoin d'ouvrir la connexion, les objets d'ADO.NET "modernes" s'en chargent, et le "Close" (ou votre "CloseConnection"), pas besoin voir dangereux, c'est le rôle de l'accolade fermante de "using(...){...}" de le faire AUTOMATIQUEMENT (via l'attribut .NET Closable / l'interface IClosable).

              >Et concernant le EndTransaction, on utilise soit COMMIT ou soit ROLLBACK

              Ok, ils n'ont pas respecté les conventions de nommage, mais ici, ça peut s'expliquer.

              Ca fait au moins 15 ans que je fais plus de DataReader, parce que c'est merdique, il est donc pas impossible qu'ils foutent un peu le bordel avec des sous-transactions.

              Moi, je fais au plus simple:

              conn.Open();//pour créer une transaction 
              using (var transaction = conn.BeginTransaction())
              {
              ...//plein de truc à base de DataAdapter
                  transaction.Commit();
              }



              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                17 décembre 2019 à 17:29:54

                MySqlConnection conn = new MySqlConnection(connectionString);
                
                            conn.Open();
                            using(var transaction = conn.BeginTransaction())
                            {
                                new MySqlCommand("UPDATE t_adresse SET `nomAdresse`='forbl' WHERE idAdresse=8;", conn, transaction).ExecuteNonQuery();
                                transaction.Rollback();
                            }
                Malheureusement, cela ne ROLLBACK toujours pas mon UPDATE
                • Partager sur Facebook
                • Partager sur Twitter
                  18 décembre 2019 à 11:25:04

                  Les classes du connecteur MySql semblent avoir un comportement bien à eux.

                  En utilisant les exemples, ça donne quoi ?

                  https://dev.mysql.com/doc/dev/connector-net/8.0/html/M_MySql_Data_MySqlClient_MySqlTransaction_Rollback.htm

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    18 décembre 2019 à 11:50:02

                    MySqlConnection myConnection = new MySqlConnection(connectionString);
                                myConnection.Open();
                    
                                MySqlCommand myCommand = myConnection.CreateCommand();
                                MySqlTransaction myTrans;
                    
                                // Start a local transaction
                                myTrans = myConnection.BeginTransaction();
                                // Must assign both transaction object and connection
                                // to Command object for a pending local transaction
                                myCommand.Connection = myConnection;
                                myCommand.Transaction = myTrans;
                    
                                myCommand.CommandText = "UPDATE t_adresse SET `nomAdresse`='test' WHERE idAdresse=8;";
                                myCommand.ExecuteNonQuery();
                    
                                myTrans.Rollback();
                                myConnection.Close();
                    Toujours la même chose, l'UPDATE est appliqué au lieu d'être ROLLBACK. Je comprends vraiment pas où est le problème
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 décembre 2019 à 14:57:11

                      - Configuration du serveur MySQL ?

                      - Configuration de la connexion MySQL (niveau d'isolement, auto-commit, etc...)

                      Tracez les commandes sur le serveur MySQL.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                        18 décembre 2019 à 18:13:42

                        Problème résolu !

                        Mes tables avaient comme moteur MyISAM et il ne gère pas les transactions. J'ai donc utilisé InnoDB et maintenant mes requêtes se ROLLBACK !

                        Merci beaucoup de votre aide !

                        -
                        Edité par AnthonyDalMaso 18 décembre 2019 à 22:15:46

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 décembre 2019 à 10:09:56

                          Merci pour l'info. :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                          ROLLBACK MySQL C#

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown