CHAUD : dataadapter dataset

Résolu
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 28 févr. 2008 à 16:07
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 1 mars 2008 à 22:50
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 mars 2008 à 22:08
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
*/
3
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
28 févr. 2008 à 16:25
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();
    }
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
1 mars 2008 à 22:36
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
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 mars 2008 à 22:50
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
*/
0
Rejoignez-nous