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

khattr 8 Messages postés lundi 15 décembre 2008Date d'inscription 20 mars 2009 Dernière intervention - 20 févr. 2009 à 10:44 - Dernière réponse : nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention
- 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 !!!

@+
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 20 févr. 2009 à 11:06
3
Merci
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()) ;

Merci krimog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de krimog
khattr 8 Messages postés lundi 15 décembre 2008Date d'inscription 20 mars 2009 Dernière intervention - 20 févr. 2009 à 11:14
0
Merci
Bonjour et merci de ta réponse rapide!!!

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

@+
Commenter la réponse de khattr
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 20 févr. 2009 à 11:15
0
Merci
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.
Commenter la réponse de nhervagault
khattr 8 Messages postés lundi 15 décembre 2008Date d'inscription 20 mars 2009 Dernière intervention - 20 févr. 2009 à 11:43
0
Merci
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....

@+
Commenter la réponse de khattr
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 20 févr. 2009 à 12:18
0
Merci
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.
Commenter la réponse de nhervagault

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.