je suis un débutant, je bosse sur un projet dans lequel j'ai besoin de selectionner les données d'une source des données MYSQL mais j'ai un problème.
on m'aafiche le message suivant "there is an open datareader associated with this connection must be close first" et pourtant je n'ai pas ouvert deux datareader mais au contraire un datareader mais avec appel d'une fonction qui utilise la methode ExecuteScalar() sur l'objet Command
voici mon code
private bool frais_deja_paye(string mois,string id)
{
string SQL = "select count(id) from payer where designation='"+mois+"' and IDeleve='" + id + "'";
MySqlCommand cmd = new MySqlCommand(SQL, Connexion.con);
try
{
int i = 0;
i = Int32.Parse(cmd.ExecuteScalar().ToString());
if (i != 0)
{
return true;
}
else
{
return false;
}
}
catch (MySqlException ex)
{
MessageBox.Show(ex.Message);
return false;
}
appel de la fonction
//la méthode qui permet d'afficher tous les paeiment
private void afficher()
{
string sql = "select id, nom,postnom from eleve where classe='" + cbx_classe.Text + "' order by (nom) asc";
MySqlCommand cmd = new MySqlCommand(sql, Connexion.con);
MySqlDataReader dr= null;
dgvEleve.Rows.Clear();
try
{
dr = cmd.ExecuteReader();
while (dr.Read())
{
//les variables relatives aux frais;
string ID_eleve = dr.GetValue(0).ToString(); //selection de l'ID de l'eleve;
string[] tableau_frais = { "non", "non", "non", "non", "non", "non", "non", "non", "non", "non", "non", "non", "non" };
MessageBox.Show(ID_eleve);
//si il a déja payé l'inscription
if(frais_deja_paye("inscription",ID_eleve))
{
tableau_frais[0] = "oui";
}
//si il a déja payé le mois de septembre
if (frais_deja_paye("septembre", ID_eleve))
{
tableau_frais[1] = "oui";
}
//si il a déja payé le mois d'octobre
if (frais_deja_paye("octobre", ID_eleve))
{
tableau_frais[2] = "oui";
}
//si il a déja payé le mois de novembre
if (frais_deja_paye("novembre", ID_eleve))
{
tableau_frais[3] = "oui";
}
//si il a déja payé le mois de décembre
if (frais_deja_paye("décembre", ID_eleve))
{
tableau_frais[4] = "oui";
}
//si il a déja payé le mois de janvier
if (frais_deja_paye("janvier", ID_eleve))
{
tableau_frais[5] = "oui";
}
//si il a déja payé le mois de février
if (frais_deja_paye("février", ID_eleve))
{
tableau_frais[6] = "oui";
}
//si il a déja payé le mois de mars
if (frais_deja_paye("mars", ID_eleve))
{
tableau_frais[7] = "oui";
}
//si il a déja payé le mois d'avril
if (frais_deja_paye("avril", ID_eleve))
{
tableau_frais[8] = "oui";
}
//si il a déja payé le mois de mai
if (frais_deja_paye("mai", ID_eleve))
{
tableau_frais[9] = "oui";
}
//si il a déja payé le mois de juin
if (frais_deja_paye("juin", ID_eleve))
{
tableau_frais[10] = "oui";
}
//ajout des élement pour chaque eleve
dgvEleve.Rows.Add(dr.GetValue(0), dr.GetValue(1), dr.GetValue(2),tableau_frais[0]);
}
}
catch (MySqlException ex)
{
MessageBox.Show(ex.Message);
}
finally
{
dr.Close();
}
}
Je refais mon laïus habituel, les "DataReader", c'est caca.
Vous n'avez pas compris comment fonctionne le garbage collector .NET, ni comment utiliser correctement le pooling de connexion de .NET, ni l'usage du "using(...){...}".
Vous prenez pas la tête avec ces antiquités et utilisez des DataSet/DataAdapter et utilisez correctement "using(...){...}".
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
fais du bien à tous, du mal à personne !!
fais du bien à tous, du mal à personne !!