lefreeman42
Messages postés28Date d'inscriptionlundi 24 octobre 2005StatutMembreDernière intervention15 juin 2006
-
27 mars 2006 à 11:35
lefreeman42
Messages postés28Date d'inscriptionlundi 24 octobre 2005StatutMembreDernière intervention15 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 ();
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();
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
Caelum
Messages postés8Date d'inscriptionmercredi 29 novembre 2000StatutMembreDernière intervention19 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+"','"
lefreeman42
Messages postés28Date d'inscriptionlundi 24 octobre 2005StatutMembreDernière intervention15 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 ???
lefreeman42
Messages postés28Date d'inscriptionlundi 24 octobre 2005StatutMembreDernière intervention15 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écupè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 à jour a bien été effectuée.");
}
catch (SqlException erreur)
{
MessageBox.Show(erreur.Message);
}
finally
{
insertion.Dispose();
//drclients.Close();
}
}
}
}
}