Problème de data reader

lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006 - 27 mars 2006 à 11:35
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006 - 28 mars 2006 à 10:54
Bonjour tout le monde ^^

J'aimerais faire une mise à jour d'une table MySQL à partir d'un fichier XML :
<Clients>
<Client Numero="1" Nom="Dupond" Prenom="Jean" Rue="52 rue Gambetta" Code_postal="42000" Ville="Saint-Etienne" Telephone="0477561221" />
<Client Numero="2" Nom="Durand" Prenom="François" Rue="18 allée des pins" Code_postal="42152" Ville="L'Horme" Telephone="0477765616" />
<Client Numero="3" Nom="Martin" Prenom="Simone" Rue="12 avenue Charles de Gaulles" Code_postal="69000" Ville="Lyon" Telephone="0478955684" />
<Client Numero="4" Nom="Toto" Prenom="Jean" Rue="162 rue des essais bidons" Code_postal="42000" Ville="Saint-Etienne" Telephone="" />
</Clients>

Dans un premier temps, je me connecte à ma base de données, puis lorsque je tente une mise à jour, j'ai un message d'erreur renvoyé par mon catch qui me dit qu'un Data reader est déjà ouvert, le problème c'est que je le trouve pas

Mon code :

//Connexion à la base MySQL
private void menuConnexion_Click(object sender, System.EventArgs e)
{
string machaineCnx;
maCnx = new OleDbConnection ();

try
{
machaineCnx = "Provider=MySQLProv;" + "Data Source=abonnement;" + "User Id=root;" + "Password=" ;
maCnx.ConnectionString = machaineCnx;
maCnx.Open();
MessageBox.Show("Connexion réussie");

//On active les menus
menuEnregistrer.Enabled=true;
menuNouveau.Enabled=true;
menuOuvrir.Enabled=true;
menuClients.Enabled=true;
}
catch (SqlException err)
{
MessageBox.Show("Exceptionin RefreshListBox: " + err.Message + "sqlcode=" + err.Number);
}
}

private void menuOuvrirXML_Click(object sender, System.EventArgs e)
{
XmlDocument domxml = new XmlDocument();

OpenFileDialog oFD = new OpenFileDialog();

oFD.InitialDirectory = "c:\";
oFD.Filter = "Fichiers collection (*.xml)|*.xml|Tous les fichiers (*.*)|*.*" ;
oFD.RestoreDirectory = true ;

if (oFD.ShowDialog() == DialogResult.OK)
{
string monFichier = oFD.FileName;

try
{
insertion = maCnx.CreateCommand();
suppression = maCnx.CreateCommand();
XmlTextReader fichierXml = new XmlTextReader(oFD.FileName);
fichierXml.WhitespaceHandling=WhitespaceHandling.None;

while (fichierXml.Read())
{
if (fichierXml.LocalName=="Client")
{
//on récupère chacun des attributs contenus dans les balises 'Client'
int numero = Convert.ToInt32(fichierXml.GetAttribute("Numero"));
string nom = fichierXml.GetAttribute("Nom");
string prenom = fichierXml.GetAttribute("Prenom");
string rue = fichierXml.GetAttribute("Rue");
string cp = fichierXml.GetAttribute("Code_postal");
string ville = fichierXml.GetAttribute("Ville");
string tel = fichierXml.GetAttribute("Telephone");

//Requête de sélection des données de la table client
mesclients = maCnx.CreateCommand();
mesclients.CommandText = "SELECT * FROM client";

drclients = mesclients.ExecuteReader();

while (drclients.Read())
{
//On vérifie si le client n'est pas déjà présent dans la base
Le problème apparait ici, il entre dans dans le if car le client 1existe déja dans la base
if ( drclients.GetInt32(0)==numero)
{
suppression.CommandText = "DELETE FROM client WHERE idcli='"+numero+"'";
Des qu'il arrive au niveau de l'exécution , il passe directement au catch :/
suppression.ExecuteNonQuery();

insertion.CommandText = "INSERT INTO client VALUES ('"+numero+"', '"+nom+"','"
+prenom+"','"+rue+"','"+cp+"','"+ville+"','"+tel+"')";
insertion.ExecuteNonQuery();
}
else
{
insertion.CommandText = "INSERT INTO client VALUES ('"+numero+"', '"+nom+"','"
+prenom+"','"+rue+"','"+cp+"','"+ville+"','"+tel+"')";
insertion.ExecuteNonQuery();
}
}
}
}
fichierXml.Close();


drclients.Close();
insertion.Dispose();
suppression.Dispose();


MessageBox.Show("La mise à jour a bien été effectuée.");
}
catch(Exception erreur)
{
MessageBox.Show(erreur.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

Si quelqu'un pouvait m'aider, ça m'arrangerait pas mal, j'aimerais présenté une AP pour le BTS avec base de données XML. Mais comme je suis parti j'ai pas grand chose lol

4 réponses

Caelum Messages postés 8 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 19 avril 2006
27 mars 2006 à 11:45
Bonjour Tof!

T'es en retard pour tes AP...

Met drclients.Close(); après la lecture, donc après ta boucle while (drclients.Read())

c'est possible que ça soit ça ^^

Byou!
0
Caelum Messages postés 8 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 19 avril 2006
27 mars 2006 à 11:46
exemple :






while
(drclients.Read())


{



//On vérifie si le client n'est pas déjà présent
dans la base
Le problème apparait ici, il entre dans dans le if car le client 1existe déja dans la base



if ( drclients.GetInt32(0)==numero)



{



suppression.CommandText = "DELETE FROM client WHERE
idcli='"+numero+"'";
Des qu'il arrive au niveau de l'exécution , il passe directement au catch :/



suppression.ExecuteNonQuery();




insertion.CommandText = "INSERT
INTO client VALUES ('"+numero+"', '"+nom+"','"




+prenom+"','"+rue+"','"+cp+"','"+ville+"','"+tel+"')";



insertion.ExecuteNonQuery();



}


else



{



insertion.CommandText = "INSERT INTO client VALUES
('"+numero+"', '"+nom+"','"




+prenom+"','"+rue+"','"+cp+"','"+ville+"','"+tel+"')";



insertion.ExecuteNonQuery();



}


}


drclients.Close();

}
}
fichierXml.Close();

insertion.Dispose();
suppression.Dispose();
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
27 mars 2006 à 11:52
Que je mette drclients.Close() dans mon if + else, ou apres mon while ca marche pas mieux, il me dit que j'ai un data reader d'ouvert associé à cette connexion.
Est-ce que ça peut venir du driver MyOleDB ???
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
28 mars 2006 à 10:54
J'ai changé de méthode de lecture, ca marche bien, jusqu'a que j'arrive au insertion.ExecuteNonQuery();
Il me met erreur Systeme :/
J'ai bien vérifié ma requête , elle est bonne.
J'ai aussi changer de méthode de connexion, je suis passé au driver ODBC, avant j'utilisais MyOleDb.

Je cherche plus à vérifier pour les doublons, si j'arrive déjà à insérer ca serait bien.

private void menuOuvrirXML_Click(object sender, System.EventArgs e)
        {            
            XmlDocument domxml = new XmlDocument();
            XmlNodeList racine;

            OpenFileDialog oFD = new OpenFileDialog();

            oFD.InitialDirectory = "c:\";
            oFD.Filter = "Fichiers collection (*.xml)|*.xml|Tous les fichiers (*.*)|*.*" ;
            oFD.RestoreDirectory = true ;

            if (oFD.ShowDialog() == DialogResult.OK)
            {
                FileStream monFichier = new FileStream(oFD.FileName,FileMode.Open);

                try
                {
                    domxml.Load(monFichier);//On charge le fichier
                }
                catch(XmlException erreur)
                {
                    MessageBox.Show(erreur.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally //Dans tous les cas on ferme le fichier
                {
                    monFichier.Close();
                }

                //On recherche le noeud racine
                racine = domxml.SelectNodes("Clients/Client");
                if (racine.Count != 0)
                {
                    foreach(XmlElement rnode in racine)
                    {
                        //on r&#233;cup&#232;re chacun des attributs contenus dans les balises 'Client'
                        int num = Convert.ToInt32(rnode.GetAttribute("Numero"));
                        string nom = rnode.GetAttribute("Nom");
                        string prenom = rnode.GetAttribute("Prenom");
                        string rue = rnode.GetAttribute("Rue");
                        string cp = rnode.GetAttribute("Code_postal");
                        string ville = rnode.GetAttribute("Ville");
                        string tel = rnode.GetAttribute("Telephone");

                        insertion = maCnx.CreateCommand();

                        try
                        {
                            insertion.CommandText = "INSERT INTO `client` VALUES ('"+num+"', '"+nom+"','";
                            insertion.CommandText = insertion + prenom+"','"+rue+"','"+cp+"','"+ville+"','"+tel+"')";
                            insertion.ExecuteNonQuery();
                                
                            MessageBox.Show("La mise &#224; jour a bien &#233;t&#233; effectu&#233;e.");
                        }
                        catch (SqlException erreur)
                        {
                            MessageBox.Show(erreur.Message);
                        }
                        finally
                        {
                            insertion.Dispose();
                            //drclients.Close();
                        }
                    }
                }
            }
        }
0
Rejoignez-nous