IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Base MySQL et requete


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 19
    Par défaut Base MySQL et requete
    Bonjour,

    A partir d'une appli en C#, j'essaye de me connecter à une base MySQL. J'utilise le connector fourni par MySQL à cette adresse http://dev.mysql.com/downloads/connector/net/5.0.html

    Bonne nouvelle, j'arrive à me connecter à la base. J'arrive à executer une commande du style UPDATE, j'arrive a afficher les lignes d'une table.

    Mais je n'arrive pas à combiner un select et un update. Je m'explique : je souhaite lister les lignes d'une table ou ... et pour chaque enregistrement, je mets à jour un champ. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    // Connexion
    MySqlConnection myConnection1 = new MySqlConnection(myConnectionString);
    myConnection1.Open();
     
    // Récupération des champs d'une table
    mySelectQuery = "SELECT elt_ref FROM table WHERE elt_etat=2";
    MySqlCommand myCommand_select = new MySqlCommand(mySelectQuery, myConnection1);
    MySqlDataReader myReader;
    myReader = myCommand_select.ExecuteReader();
     
     
    //Pour chaque ligne de mon reader
    while (myReader.Read())
    {
      // calcul de maVar
      maVar=...;
     
      // Nouvelle connexion
      MySqlConnection myConnection2 = new MySqlConnection(myConnectionString);
      myConnection2.Open();
     
      // update
      myCommand_update = new MySqlCommand("UPDATE table SET elt_truc='" + maVar + "' WHERE elt_ref='" + myReader.GetString("elt_ref") + "'", myConnection2);
      myCommand_update.Connection = myConnection2;
      myCommand_update.ExecuteNonQuery();
     
      // Déconnexion
      myCommand_update.Connection.Close();
      myConnection2.Close();
    }
     
    // Déconnexion
    myReader.Close();
    myCommand_select.Connection.Close();
    Le problème vient de la ligne
    myCommand_update.ExecuteNonQuery();
    qui ne veut pas s'exécuter.

    Pourriez-vous m'aider?
    Peut-être le connecteur MySQL n'est pas bon?


    Merci pour vos infos

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    A mon avis, ton problème vient d'ici:

    myReader.GetString("elt_ref")

    Essaye plutôt:

    myReader.GetString(0)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 19
    Par défaut
    Citation Envoyé par Thomas Lebrun
    A mon avis, ton problème vient d'ici:

    myReader.GetString("elt_ref")

    Essaye plutôt:

    myReader.GetString(0)
    Merci pour ta réponse.
    J'ai essayé et meme problème.
    L'avantage d'utiliser myReader.GetString("elt_ref"), c'est quand mes requetes ont de multiples champs. C'est moins risque de les appeler par leur nom.
    En effet GetString à deux surcharges. La premiere prend bien un entier et la seconde une chaine string correspondant au nom du champ.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 19
    Par défaut
    A Thomas Lebrun

    En regardant dans ta signature, j'ai vu que tu est l'auteur de la page http://morpheus.developpez.com/mysqldotnet/
    Avant de commencer le développement C# MySQL, j'avais déjà cherché des infos sur le web et j'avais lu ta page.

    Comme j'ai la chance d'avoir l'auteur sous la main, peut-être peux-tu me donner quelques explications.

    Habituellement, dans les autres langages pour accéder à une base de donnée, on se connecte, on execute nos requetes et on se déconnecte.
    Dans notre cas, j'ai l'impression qu'a partir d'une connexion, on ne peut avoir qu'un seul acces simultané à la base de donnée... Etrange non?

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Si tu affiches (dans une MessageBox par exemple), le contenu de

    "UPDATE table SET elt_truc='" + maVar + "' WHERE elt_ref='" + myReader.GetString("elt_ref") + "'"

    tu as quoi qui apparait ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 19
    Par défaut
    Je viens de vérifier, j'ai ma requete qui s'affiche en bon SQL.

    Comme j'ai dit un peu plutot, c'est la ligne myCommand_update.ExecuteNonQuery(); qui pose pb.
    En effet lors de l'exécution pas à pas, lorsque j'arrive sur cette ligne, le system travail sans me donner la main. C'est comme s'il fallait plusieurs heures de traitement pour exécuter la requete. Mais je n'ai pas de plantage, pas d'exception à noter
    Après vérification, la requete de mise à jour à bien été faite.

    La je n'y comprend plus rien!!


    si j'execute la requete toute seul (hors de la boucle) avec une seule connection, tout est OK. J'ai l'impression que je ne peut pas avoir deux accès à la base...

    Etrange...

    Est-il possible d'ouvrir deux connexions simultanées? Peut-on faire deux requetes sur une meme connexion.
    Je viens de tester le meme algo en VBA access et la pas de pb. Mes bases sont en ODBC.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 19
    Par défaut
    Bonjour,

    Merci pour tes infos. J'ai fait comme dit hier, une boucle qui permet de récupérer les données du select dans une liste, puis traitement des données de la liste.

    Je mets le code. Peux-tu le relire et me dire ce que tu en penses. Peux-tu m'aider pour avoir un code propre

    Au début de ma class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            // Paramètre de connection MySQL
            protected string myConnectionString = "Database=MaBase;Data Source=MonServeur;User Id=root;Password=";
    La class pour la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            private class A
            {
                public string A_ref;
                public string A_code;
            }
    la fonction de parcours de la base et MAJ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
            {
                Log("Début test MySql.Data.MySqlClient");
     
                List<A> listA = new List<A>();
                A tempA;
                int nb_total = 0;
                string mySelectQuery, mySelectQuery2;
     
                // Connection à la base
                MySqlConnection myConnection = new MySqlConnection(myConnectionString);
                myConnection.Open();
     
                // Recherche de la liste des As
                mySelectQuery = "SELECT A_ref, A_code FROM A WHERE A_etat>=1";
                MySqlCommand myCommand_select = new MySqlCommand(mySelectQuery, myConnection);
                MySqlDataReader myReader;
                myReader = myCommand_select.ExecuteReader();
     
                // Initialisation de la liste
                while (myReader.Read())
                {
                    tempA = new A();
                    tempA.A_ref = myReader.GetString("A_ref");
                    tempA.A_code = myReader.GetString("A_code");
     
                    listA.Add(tempA);
                    nb_total++;
                }
                myReader.Close();
                myCommand_select.Connection.Close();
     
                // Initialisation de la barre de progression
                pb_maj.Maximum = nb_total;
                pb_maj.Value = 0;
     
                MySqlCommand myCommand_update;
                myConnection.Open();
                // Parcours de la liste
                for (int indice = 0; indice < listA.Count; indice++)
                {
                    // Mise à jour du code
                    mySelectQuery2 = "UPDATE A SET A_code='" + calculCode(listA[indice].A_code) + "', A_datemodif=Now() WHERE A_ref='" + listA[indice].A_ref + "'";
                    myCommand_update = new MySqlCommand(mySelectQuery2, myConnection);
                    myCommand_update.ExecuteNonQuery();
                    pb_maj.Value++;
                }
                //myCommand_update.Connection.Close();
     
                //Fermeture de la base
                myConnection.Close();
     
                Log("Fin test MySql.Data.MySqlClient");
                MessageBox.Show(this, "Fin");
            }
    Il y a une progressBar pb_maj
    une fonction log qui écrit dans un fichier la date et le texte en paramètre
    une fonction calculcode qui retourne un string de 7 à 9 caractères

    Test d'une exécution 24 secondes pour 24000 enregistrements.

    En conclusion :
    * Je garde le drivers MySQL qui a au moins l'avantage de gérer le nom des champs plutot que le numéro des champs dans la requete.
    * Qui est assez rapide
    * Qui ne peut pas exécuter "mes requetes en boucle"


    ==> Un grand merci à Thomas Lebrun

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Requetes Access sur base MySQL
    Par hotlineinser dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 06/07/2012, 09h42
  2. lancer une requete vers une base MySql
    Par Godard dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/08/2010, 11h56
  3. [MySQL] interrogation base mysql et requete soucis avec row
    Par clem62173 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/01/2010, 19h03
  4. Réponses: 2
    Dernier message: 26/06/2009, 14h23
  5. requete base mysql
    Par Panaméen dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/01/2009, 21h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo