CHAUD : dataadapter dataset [Résolu]

Signaler
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Attention c'est CHAUD

Dans une form j'ai declaré un dataset et un dataadapter afin de les utiliser dans deux fonction de query distincte et dans une fonction d'update

Mais voila j'ai un comportement bizare !!

1 Situation normale
Dans le cas ci apres ma fonction de select utilise un dataset local et l'adapter commun : tout va bien mais ce dataset ne pourra pas etre utilisé dans l'update donc ca ne me sert pas

    select2(string selectcmd)
    {
      MySqlDataAdapter adapter = new MySqlDataAdapter();
      adapter.SelectCommand = new MySqlCommand(selectcmd, conn);
      DataSet dsAddr1 = new DataSet();
      adapter.Fill(dsAddr1);
      dgv_addr.DataSource = dsAddr1.Tables[0];
      txb_count.Text = dsAddr1.Tables[0].Rows.Count.ToString();
    }


2 Situation INCOMPREHENSIBLE

Dans le cas ci apres ma fonction de select utilise le dataset commun et l'adapter commun :
Je fais un clear du dataset qui a déja eté utilisé et a servi de datasource a dgv_addr dans un autre select
Au moment du fill un event row_enter the dgv_addr est genéré il applelle ShowAddrProp qui balance un mesage d'erreur lors du fill
Chapeau a celui qui pet m'expliquer

    select2(string selectcmd)
    {
      MySqlDataAdapter adapter = new MySqlDataAdapter();
      adapter.SelectCommand = new MySqlCommand(selectcmd, conn);
      dsAddr.Clear();
      adapter.Fill(dsAddr);  // -> event row_enter de dgv_addr et crash dans appel fonction ci apres
      dgv_addr.DataSource = dsAddr.Tables[0];
      txb_count.Text = dsAddr.Tables[0].Rows.Count.ToString();


    }

    // *******************************************************************************
    void ShowAddrProp(int addrID)
    {
      string selectcmd;
      int j;
      int di;


      MySqlDataAdapter adapter1 = new MySqlDataAdapter();
      selectcmd = "SELECT * FROM `containers` where addrID=" + addrID.ToString();
      adapter1.SelectCommand = new MySqlCommand(selectcmd, conn);


      // On définit en lieu de stockage et on le rempli avec le résultat de la requête
      DataSet ds1 = new DataSet();
      adapter1.Fill(ds1);  // crash {"There is already an open DataReader associated with this Connection which must be closed first."}

      dgv_cont.DataSource = ds1.Tables[0];
    }




{"There is already an open DataReader associated with this Connection which must be closed first."}

4 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Salut,

Le message d'erreur est relativement clair : pourquoi passer par la même connexion (à moins que MySQL dispose d'une fonctionnalité similaire à MARS sur SQL Server 2005) ?
Concernant le fonctionnement de ton contournement, je pense que le code du contrôle DataGridView ferme la connexion existante au moment où on le détache de sa source des données, du coup elle est bien fermée au moment de ta seconde utilisation.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
3
Salut

En posant le problème j'ai intuitivement trouvé un contournement, mais je ne comprends toujours pas bien l'origine du problème

    select2(string selectcmd)
    {
      MySqlDataAdapter adapter = new MySqlDataAdapter();
      adapter.SelectCommand = new MySqlCommand(selectcmd, conn);
      dgv_addr.DataSource = null;  // j'a ajouté ceci en pensant que dgv n'allait pas aimer se trouver orphelin
      dsAddr.Clear();
      adapter.Fill(dsAddr);  // maintenant plus de plantage
      dgv_addr.DataSource = dsAddr.Tables[0];
      txb_count.Text = dsAddr.Tables[0].Rows.Count.ToString();
    }
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
3
Zut alors

J'avais fait une belle reponse mais j'ai accepte la tienne avant d'envoyer donc j'ai tout perdu

En gros tu a raison je pense que la solution que j'ai apliquée est la plus pertinente
Mais je pense que c'est plus le datareader (MysqlDataAdapter) qui est perturbé que la connection (conn) elle meme

Et il n'y a de toute facon pas besoin d'ouvrir une nouvelle connection ici.

Par contre j'ai fais a mon avis une autre connerie que je viens de voir, c'est que precisement j'utilise un nouvel adapter plutot que mon adapter commun qui est censé servir pour les mise a jour.
Donc j'ai contourné le probleme mais j'ai pas corrigé le fond

Je vais donc essayer l'adapter déja utilisé et voir comment ca se comporte
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Oui, le fond du problème est que 2 datareaders ne peuvent être ouverts sur la même connexion simultanément.
Le premier doit être clos, sauf dans le cas de MARS qui justement adresse ce "problème" (Multiple Active Result Sets).

/*
coq
MVP Visual C#
CoqBlog
*/