[C#] [Mysql] Message 'Datareader déjà associé à cette connexion" ... alors que l [Résolu]

Signaler
Messages postés
8
Date d'inscription
lundi 15 décembre 2008
Statut
Membre
Dernière intervention
20 mars 2009
-
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
-
Bonjour,

J'utilise le connecteur Mysql 5.2.5 pour régulièrement interroger une base de données.
J'ai un timer à 10s qui m'appelle la fonction suivante :

 private void HasCMDToSend()
        {
            lock (SqlConnect)
            {
                string mySelectQuery = "SELECT * FROM commande;";
                MySqlCommand myCommand = new MySqlCommand(mySelectQuery, SqlConnect);
                
                if (SqlConnect.State == ConnectionState.Open)
                {
                    MySqlDataReader myReader = myCommand.ExecuteReader();
                    // Always call Read before accessing data.
                    while (myReader.Read())
                    {
                     GetCmdToSend(myReader.GetString("cmd"),myReader.GetString("num"));
                    }
                  
                    myReader.Close();
                  
// Même en fermant la connexion, j'ai ce message ... :-(
                    //SqlConnect.Close();
                }
            }



Apparemment, un certain nombre de gens sont confronté à ce problème ... Mais personne n'a de solution ...

J'imagine que je dois faire une erreur basique, mais là je ne vois pas laquelle...

Si quelqu'un a une piste , je l'en remercie d'avance !!!

@+

5 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
35
Ce que je vais proposer n'est pas spécialement propre, mais tu peux au moins essayer :

Plutôt que de faire juste un SqlConnect.Open() puis un SqlConnect.Close(), essaye carrément de créer un new SqlConnection à chaque fois. (suivi évidemment du Open() et du Close())

Krimog :
while (!succeed = try()) ;
Messages postés
8
Date d'inscription
lundi 15 décembre 2008
Statut
Membre
Dernière intervention
20 mars 2009

Bonjour et merci de ta réponse rapide!!!

Il est vrai que c'est "pas propre" mais au moins c'est fonctionnel.

@+
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
25
Salut,

Pourquoi un lock?

Pourquoi mettre la connection dans un timer?

Peux etre une explication ici?

http://www.aspfr.com/forum/sujet-ERREUR-DATAREADER-ASSOCIE-COMMANDE-EST-DEJA-OUVERT-DOIT_815804.aspx

Ta requete est encore en cours d'execution quand le deuxieme timer arrive

Regardes en montant le timer a 1 minutes si tu as les meme probleme.
Messages postés
8
Date d'inscription
lundi 15 décembre 2008
Statut
Membre
Dernière intervention
20 mars 2009

Bonjour,

1) pourquoi Lock ?

Je me le lock pour bloquer l'objet de façon à ce que mes autres threads ne tape pas dans la base pendant que la connexion est ouverte ...

2) pourquoi  la connexion dans un timer ?

Je vérifie periodiquement dans la base de données qu'il n'y a rien à traiter ...

Les données sont amenés par un processus que je ne maitrise pas (autre appli distante) ....

A moins qu'il existe un OnDataInserted en Mysql ??? ;-)

Et non, quand j'avais l'erreur, je n'avais pas de connexion en cours sur la BDD , justement grace aux autres lock...

Nan, j'ai ce problème uniquement quand j'execute un reader ... je peux passer autant de Nonquery que je veux mais pas de Reader....

@+
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
25
Ok,

Pour le OnDataInserted je ne pense pas que cela aurait fonctionner
car c'est un evenement qui est lancé par le framework dotnet du programme en cours et non un espion qui espionne les insertions sur une base.

Il y a sur mysql 5.0 les triggers qui eux espionnent les insertions par exemple
mais cela ne repond peut être pas à la demande, mais ca doit etre plus optimisé qu'un select toutes les dix secondes.