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 :

C# --> MySql : There is already an open DataReader associated with this Connection


Sujet :

C#

  1. #1
    Membre très actif Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Par défaut C# --> MySql : There is already an open DataReader associated with this Connection
    Bonjour amis developezistes,

    je développe une appli C# chargée de se connecter à une base MySql sur un serveur distant.

    Je rencontre le message d'erreur suivant lorsque j'essaie d'insérer des données dans les tables de la base :

    MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be
    closed first.
    à MySql.Data.MySqlClient.MySqlCommand.CheckState()
    à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
    à MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
    à ExportHeurèsToMySql.ConnexionVersMySql.ordreSql(String ordSql) dans C:\~chemin très long~\ConnexionVersMySql.cs:ligne 83

    Voici le code coupable :



    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
    public void ordreSql(string ordSql)
    		{
    			MySqlDataAdapter MyAdapter = new MySqlDataAdapter();
     
    			MyAdapter.SelectCommand = new MySqlCommand(ordSql, this.connection);
     
    			try
    			{
    				MyAdapter.SelectCommand.ExecuteNonQuery();
    			}
    			catch (Exception e)
    			{
    				Console.WriteLine("Erreur sur l'ordre SQL suivant : " + ordSql);
    				Console.WriteLine(e.ToString());
    			}
    		}
    Toutefois ce code a fonctionné parfaitement pour créer les tables dans la base.

    J'admets avoir copié-collé-modifié ce code sans vraiment comprendre le principe derrière

    J'ai essayé quelques bidouilles comme "MyAdapter.Dispose()" etc mais sans résultat.

    Vos suggestions sont les bienvenues !

  2. #2
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 149
    Par défaut
    Salut,
    Tu as dû oublier de fermer un datareader et même ta connexion à la base de données. Je t'explique le principe pour que tu comprenne comme ça à l'avenir tu te débrouilleras tout seul.
    1. tu ouvre ta connexion à la base de données
    2. tu attribue cette connexion à ton objet datareader, command et autre
    3. tu ferme l'objet(command, ou datareader)
    4. tu ferme la connexion à la base de données.
    comme suit:

    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
     
    private void exempleDeCode()
     //Je suppose dans mon cas que j'utilise sqlserver en lieu et place de MySql
     
     
    SqlConnection SqlCnx = new SqlConnection("ma chaîne de connexion");
    SqlCommand SqlCmd = new SqlCommand();
    SqlDataReader SqlDr;
    try
    {
       SqlCnx.Open(); //ouverture de la connexion (1)
       SqlCmd.Connexion = SqlCnx; //définition de la connexion de mon objet command (2)
       SqlCmd.CommandType = CommandType.Text;
       SqlCmd.CommandText ="ma requête Sql";
       SqlDr = SqlCmd.ExecuteReader();
     
       While(SqlDr.Read())
        {
            //récupération des données du datareader
        }SqlDr.Close(); //(3)
    catch(SqlException Ex)
    {
        MessageBox.Show(Ex.ToString());
    }
    finally
    {
       SqlCnx.Close();//Fermeture de ma connexion (4)
    }

  3. #3
    Membre très actif Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Par défaut
    Mon problème est bien de fermer l'objet MySqlDataAdapter mais je ne trouve rien pour ce faire, si ce n'est "dispose()" (qui ne fonctionne pas à temps).

    Un doute m'assaille : il faut que je ferme la connexion à la base après chaque requête ? Ca me parait pas logique / optimal surtout que j'ai environ 200 000 requêtes à faire sur la base

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par jmnicolas Voir le message
    Mon problème est bien de fermer l'objet MySqlDataAdapter mais je ne trouve rien pour ce faire, si ce n'est "dispose()" (qui ne fonctionne pas à temps).
    Non, le problème n'est pas ce DataAdapter, mais un DataReader que tu aurais ouvert avant. Vérifie que tu l'a bien fermé. Pour éviter ce genre de problème, utilise toujours les objets disposables dans un bloc using

    Citation Envoyé par jmnicolas Voir le message
    Un doute m'assaille : il faut que je ferme la connexion à la base après chaque requête ? Ca me parait pas logique / optimal surtout que j'ai environ 200 000 requêtes à faire sur la base
    Non bien sûr, pas la peine de fermer la connexion à chaque requête

  5. #5
    Membre très actif Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Par défaut
    Bon j'ai trouvé !

    Comme le message d'erreur était pas vraiment parlant, j'avais pas pensé à vérifier si mon ordre sql était valide (vu que les autres s'exécutaient sans problème).

    En fait j'avais un champ contenant 'Prés D'Aumont' et forcément l'apostrophe a créé la confusion par rapport aux quotes.

    Je suppose donc que l'erreur SQL a empêché la fermeture du datareader ce qui a généré le message d'erreur rencontré.

    La BDD précédente me donnait vraiment des messages d'erreur précis (en même temps c'était une BDD java intégrée dans un programme java donc ça aide), je saurai à l'avenir qu'avec MySql ce n'est pas le cas et je vérifierai la validité de mes requêtes avant de vous solliciter.

    Quoiqu'il en soit, merci pour votre aide et joyeuses fêtes de fin d'année

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par jmnicolas Voir le message
    En fait j'avais un champ contenant 'Prés D'Aumont' et forcément l'apostrophe a créé la confusion par rapport aux quotes.
    Ah, les méfaits des requêtes générées par concaténation
    En utilisant des paramètres, tu n'aurais pas eu de problème
    Jette un oeil à cet article

  7. #7
    Membre très actif Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ah, les méfaits des requêtes générées par concaténation
    En utilisant des paramètres, tu n'aurais pas eu de problème
    Jette un oeil à cet article
    je me coucherai moins bête ce soir, merci beaucoup

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

Discussions similaires

  1. [2012] There is no data source view associated with this cube
    Par clementratel dans le forum SSAS
    Réponses: 1
    Dernier message: 21/08/2013, 15h17
  2. mysql adapter is already open
    Par zeusensa dans le forum VB.NET
    Réponses: 3
    Dernier message: 07/04/2011, 13h41
  3. Réponses: 1
    Dernier message: 12/01/2009, 17h52
  4. Licence MySQL pour un site Web d'une association
    Par Tchupacabra dans le forum Outils
    Réponses: 2
    Dernier message: 14/11/2007, 20h54
  5. facet already has a child associated
    Par *alexandre* dans le forum JSF
    Réponses: 1
    Dernier message: 22/09/2006, 15h41

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