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#

  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
    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
    Citation Envoy� par lio69
    si j'execute la requete toute seul (hors de la boucle) avec une seule connection, tout est OK.
    En m�me temps, tu es dans une boucle donc n'oublie pas qu'il va faire l'update pour chacune des ligne de la table...

    J'ai l'impression que je ne peut pas avoir deux acc�s � la base...
    Essaye en remplacant:
    myCommand_update = new MySqlCommand("UPDATE table SET elt_truc='" + maVar + "' WHERE elt_ref='" + myReader.GetString("elt_ref") + "'", myConnection2);
    myCommand_update.Connection = myConnection2;


    par:
    myCommand_update = new MySqlCommand("UPDATE table SET elt_truc='" + maVar + "' WHERE elt_ref='" + myReader.GetString("elt_ref") + "'", myConnection1);
    myCommand_update.Connection = myConnection1;

  8. #8
    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
    D�j� un grand merci pour le temps que tu passes sur mon pb.

    Ca ne marche toujours pas
    Lorsqu'il est sur la ligne myCommand_update.ExecuteNonQuery();
    , j'ai une erreur. Je l'interc�pte par un catch et j'ai le message suivant
    There is already an open DataReader associated with this Connection which must be closed first.
    Si je te fais passer le code complet, penses-tu pouvoir avoir plus d'info?

  9. #9
    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
    Pas besoin du code.

    Voila ce que je te propose:

    Dans la boucle while, tu stockes, dans une List<string> la liste des elt_ref.
    Ensuite, tu fermes la 1�re connexion, tu en ouvres une deuxi�me et tu fais une autre boucle while dans laquelle tu fais tes update


    A+

  10. #10
    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
    Ok, en theorie ca doit marcher. Je peux meme faire une Liste<Template> pour avoir tous mes champs.

    Le pb, c'est que je suis oblig� de parcourir les 28000 �l�ments de ma premi�re requete pour les mettre dans la liste.
    Puis de parcourir les 28 000 �l�ments de ma liste pour faire l'update.
    Et a chaque update, je dois connecter la base, executer l'update et fermer la base...

    C'est possible, mais je trouve que ce n'est pas tres propre. Qu'en penses-tu? J'ai l'impression que MySQL et C# n'est pas la combinaison optimum!

  11. #11
    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
    Citation Envoy� par lio69
    Et a chaque update, je dois connecter la base, executer l'update et fermer la base...
    Pourquoi fermer la connexion entre chaque update ?

    - Tu ouvres la connexion
    - Tu fais tes updates
    - Tu fermes la connexion

  12. #12
    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