olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 2010
-
28 févr. 2008 à 16:07
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDerniè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."}
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 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
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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).