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

Résolu
khattr Messages postés 8 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 20 mars 2009 - 20 févr. 2009 à 10:44
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 - 20 févr. 2009 à 12:18
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 !!!

@+
A voir également:

5 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 50
20 févr. 2009 à 11:06
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()) ;
3
khattr Messages postés 8 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 20 mars 2009
20 févr. 2009 à 11:14
Bonjour et merci de ta réponse rapide!!!

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

@+
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
20 févr. 2009 à 11:15
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.
0
khattr Messages postés 8 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 20 mars 2009
20 févr. 2009 à 11:43
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....

@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
20 févr. 2009 à 12:18
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.
0