Convertiseur xml vers sql

Description

Ce code permet d'ouvrir, de lire et de transformer un fichier XML en une requete SQL. Il permet également d'executer la requete SQL sur un serveur SQL tout en choissisant la base dans la quelle on souhaite executer la requete (test réaliser avec le MSDE gratuit telechargeable sur le site de microsoft).
Le code est réaliser avec sharpdevelop qui lui aussi est gratuit.
2 fichiers xml sont fournit dans le zip pour tester l'application.
Meme sans connexion SQL valide il est possible de tester la conversion XML -> SQL

Source / Exemple :


/* 01/11/2004 at 10:06

    (`-()_.-=-.
    /66  ,  ,  \
  =(o_/=//_(   /======`
      ~"` ~"~~`    tely

  Created by Clemence.

  • /
using System; using System.Windows.Forms; using System.IO; using System.Data; using System.Data.SqlClient; namespace DefaultNamespace { public class MainForm : System.Windows.Forms.Form { private System.Windows.Forms.MenuItem enregistrer; private System.Windows.Forms.RichTextBox affichage; private System.Windows.Forms.MenuItem quitter; private System.Windows.Forms.MenuItem menuItem7; private System.Windows.Forms.MenuItem ouvrir; private System.Windows.Forms.DataGrid Grille; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.DataGrid xml; private System.Windows.Forms.MenuItem menuItem6; private System.Windows.Forms.MenuItem menuItem5; private System.Windows.Forms.RichTextBox requete; private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem aide; private System.Windows.Forms.ComboBox ChoixBase; private System.Windows.Forms.MenuItem sql; private System.Windows.Forms.MenuItem menuItem10; // déclaration de mes variables private SqlConnection MaSqlCnx = new SqlConnection(); private OpenFileDialog MaBoite = new OpenFileDialog(); private DataSet unDS = new DataSet(); private string sCreate = ""; private SqlCommand MySqlCmd = new SqlCommand(); private SaveFileDialog MaSauvegarde = new SaveFileDialog(); private StreamWriter sEcrire; private DataSet dsXml = new DataSet(); private DataTable dtSource = null; private SqlDataAdapter da = null; private DataSet ds = new DataSet(); public MainForm() { InitializeComponent(); } [STAThread] public static void Main(string[] args) { Application.Run(new MainForm()); } #region Windows Forms Designer generated code /// <summary> /// This method is required for Windows Forms designer support. /// Do not change the method contents inside the source code editor. The Forms designer might /// not be able to load this method if it was changed manually. /// </summary> private void InitializeComponent() { this.menuItem10 = new System.Windows.Forms.MenuItem(); this.sql = new System.Windows.Forms.MenuItem(); this.ChoixBase = new System.Windows.Forms.ComboBox(); this.aide = new System.Windows.Forms.MenuItem(); this.mainMenu1 = new System.Windows.Forms.MainMenu(); this.requete = new System.Windows.Forms.RichTextBox(); this.menuItem5 = new System.Windows.Forms.MenuItem(); this.menuItem6 = new System.Windows.Forms.MenuItem(); this.xml = new System.Windows.Forms.DataGrid(); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.menuItem2 = new System.Windows.Forms.MenuItem(); this.Grille = new System.Windows.Forms.DataGrid(); this.ouvrir = new System.Windows.Forms.MenuItem(); this.menuItem7 = new System.Windows.Forms.MenuItem(); this.quitter = new System.Windows.Forms.MenuItem(); this.affichage = new System.Windows.Forms.RichTextBox(); this.enregistrer = new System.Windows.Forms.MenuItem(); ((System.ComponentModel.ISupportInitialize)(this.xml)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.Grille)).BeginInit(); this.SuspendLayout(); // // menuItem10 // this.menuItem10.Index = 2; this.menuItem10.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.aide}); this.menuItem10.Text = "?"; // // sql // this.sql.Index = 1; this.sql.Text = "SQL"; this.sql.Click += new System.EventHandler(this.SQL); // // ChoixBase // this.ChoixBase.Location = new System.Drawing.Point(8, 24); this.ChoixBase.Name = "ChoixBase"; this.ChoixBase.Size = new System.Drawing.Size(152, 21); this.ChoixBase.TabIndex = 3; this.ChoixBase.Text = "-----Selection----"; // // aide // this.aide.Index = 0; this.aide.Text = "A propos"; this.aide.Click += new System.EventHandler(this.Aide); // // mainMenu1 // this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem1, this.menuItem5, this.menuItem10}); // // requete // this.requete.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.requete.Location = new System.Drawing.Point(568, 56); this.requete.Name = "requete"; this.requete.Size = new System.Drawing.Size(452, 136); this.requete.TabIndex = 1; this.requete.Text = ""; // // menuItem5 // this.menuItem5.Index = 1; this.menuItem5.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem6, this.menuItem2}); this.menuItem5.Text = "Affichage"; // // menuItem6 // this.menuItem6.Index = 0; this.menuItem6.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem7, this.sql}); this.menuItem6.Text = "Afficher"; // // xml // this.xml.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.xml.CaptionForeColor = System.Drawing.SystemColors.ActiveCaptionText; this.xml.DataMember = ""; this.xml.HeaderForeColor = System.Drawing.SystemColors.ControlText; this.xml.Location = new System.Drawing.Point(568, 208); this.xml.Name = "xml"; this.xml.Size = new System.Drawing.Size(452, 208); this.xml.TabIndex = 2; // // menuItem1 // this.menuItem1.Index = 0; this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.ouvrir, this.enregistrer, this.quitter}); this.menuItem1.Text = "Fichiers"; // // menuItem2 // this.menuItem2.Index = 1; this.menuItem2.Text = "Requette"; this.menuItem2.Click += new System.EventHandler(this.Requette); // // Grille // this.Grille.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.Grille.CaptionForeColor = System.Drawing.SystemColors.ActiveCaptionText; this.Grille.DataMember = ""; this.Grille.HeaderForeColor = System.Drawing.SystemColors.ControlText; this.Grille.Location = new System.Drawing.Point(568, 432); this.Grille.Name = "Grille"; this.Grille.Size = new System.Drawing.Size(452, 184); this.Grille.TabIndex = 4; // // ouvrir // this.ouvrir.Index = 0; this.ouvrir.Shortcut = System.Windows.Forms.Shortcut.CtrlO; this.ouvrir.Text = "Ouvrir"; this.ouvrir.Click += new System.EventHandler(this.Ouvrir); // // menuItem7 // this.menuItem7.Index = 0; this.menuItem7.Text = "XML"; this.menuItem7.Click += new System.EventHandler(this.XML); // // quitter // this.quitter.Index = 2; this.quitter.Shortcut = System.Windows.Forms.Shortcut.AltF4; this.quitter.Text = "Quitter"; this.quitter.Click += new System.EventHandler(this.Quitter); // // affichage // this.affichage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); this.affichage.Location = new System.Drawing.Point(8, 56); this.affichage.Name = "affichage"; this.affichage.Size = new System.Drawing.Size(544, 560); this.affichage.TabIndex = 0; this.affichage.Text = ""; // // enregistrer // this.enregistrer.Index = 1; this.enregistrer.Shortcut = System.Windows.Forms.Shortcut.CtrlS; this.enregistrer.Text = "Enregistrer"; this.enregistrer.Click += new System.EventHandler(this.Enregistrer); // // MainForm // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(1028, 621); this.Controls.Add(this.Grille); this.Controls.Add(this.ChoixBase); this.Controls.Add(this.xml); this.Controls.Add(this.requete); this.Controls.Add(this.affichage); this.Menu = this.mainMenu1; this.Name = "MainForm"; this.Text = "MainForm"; this.Load += new System.EventHandler(this.MainFormLoad); ((System.ComponentModel.ISupportInitialize)(this.xml)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.Grille)).EndInit(); this.ResumeLayout(false); } #endregion private void Quitter( object sender, System.EventArgs e) { this.Close(); //Fermeture de l'application } private void Ouvrir( object sender, System.EventArgs e) { MaBoite.Filter = ""; // initialisation xml.Text = ""; requete.Text = ""; MaBoite.Filter= "XML (*.xml)|*.xml| tous (*.*)|*.*"; // définition de types de fichiers ouvrables MaBoite.FilterIndex = 0; MaBoite.RestoreDirectory = true; MaBoite.ShowDialog(); if (MaBoite.FileName != "") { try { unDS.ReadXml(MaBoite.FileName); // l'ouverture du fichier est placée dans le try } catch (System.Exception ex) // traitement d'un fichier xml non valide { MessageBox.Show (ex.Message); string MsgErreur = Convert.ToString(ex); int idebut = MsgErreur.IndexOf("(")+1; int ifin = MsgErreur.IndexOf(")"); int iTaille = ifin - idebut; string sChaine = MsgErreur.Substring(idebut,iTaille); string sChaineFerme = "</"+sChaine+">"; sChaine = "<"+sChaine+">"; StreamReader unSR = new StreamReader(MaBoite.FileName); string sTest = unSR.ReadToEnd(); unSR.Close(); int iEJdepart=sTest.IndexOf(sChaine); int iEJarrive=sTest.IndexOf(sChaineFerme); int iEJdepart2=sTest.LastIndexOf(sChaine); int iEJarrive2=sTest.LastIndexOf(sChaineFerme); while(iEJdepart!=iEJdepart2) { string sDebut = sTest.Substring(0,iEJdepart2); string sFin = sTest.Substring(iEJarrive2+sChaineFerme.Length); sTest = sDebut+sFin; iEJdepart2 = sTest.LastIndexOf(sChaine); iEJarrive2 = sTest.LastIndexOf(sChaineFerme); } sTest = sTest.Replace("encoding="+'\u0022'+"UTF-16"+'\u0022',""); xml.Text = sTest; StreamWriter sw = new StreamWriter(MaBoite.FileName); sw.WriteLine(sTest); sw.Close(); } StreamReader SR = new StreamReader(MaBoite.FileName); // affichage du code XML du fichier ouvert affichage.Text = unDS.GetXml(); // le xml lu est affiché à l'écran } } private void Enregistrer( object sender, System.EventArgs e) { if(requete.Text =="") { MessageBox.Show("Il n'y a rien à sauvegarder !!"); } else { MaSauvegarde.Filter= "texte (*.txt) |*.txt|tous (*.*) |*.*"; MaSauvegarde.FilterIndex = 0; MaSauvegarde.RestoreDirectory = true; MaSauvegarde.ShowDialog(); if(MaSauvegarde.FileName != "") { try // on place un try sur l'écriture { sEcrire = new StreamWriter(MaSauvegarde.FileName, true); sEcrire.WriteLine(requete.Text); sEcrire.Close(); } catch(System.Exception ex) { MessageBox.Show(ex.Message); // si l'écriture échoue on en informe l'utilisateur } } } } private void XML( object sender, System.EventArgs e) { if(MaBoite.FileName!= "") { string filePath =MaBoite.FileName; try { dsXml.ReadXml(filePath); xml.DataSource = dsXml; } catch(System.Exception ex) { MessageBox.Show (ex.Message); string MsgErreur = Convert.ToString(ex); int idebut = MsgErreur.IndexOf("(")+1; int ifin = MsgErreur.IndexOf(")"); int iTaille = ifin - idebut; string sChaine = MsgErreur.Substring(idebut,iTaille); string sChaineFerme = "</"+sChaine+">"; sChaine = "<"+sChaine+">"; StreamReader unSR = new StreamReader(MaBoite.FileName); string sTest = unSR.ReadToEnd(); unSR.Close(); int iEJdepart=sTest.IndexOf(sChaine); int iEJarrive=sTest.IndexOf(sChaineFerme); int iEJdepart2=sTest.LastIndexOf(sChaine); int iEJarrive2=sTest.LastIndexOf(sChaineFerme); while(iEJdepart!=iEJdepart2) { string sDebut = sTest.Substring(0,iEJdepart2); string sFin = sTest.Substring(iEJarrive2+sChaineFerme.Length); sTest = sDebut+sFin; iEJdepart2 = sTest.LastIndexOf(sChaine); iEJarrive2 = sTest.LastIndexOf(sChaineFerme); } sTest = sTest.Replace("encoding="+'\u0022'+"UTF-16"+'\u0022',""); xml.Text = sTest; StreamWriter sw = new StreamWriter(MaBoite.FileName); sw.WriteLine(sTest); sw.Close(); // si l'écriture échoue on en informe l'utilisateur } } } private void SQL( object sender, System.EventArgs e) { requete.Text = ""; // on initialise la zone d'affichage et notre chaîne de création à vide sCreate = ""; foreach(DataTable DT in unDS.Tables) // pour chaque table on va effectuer les opérations contenues dans le foreach { sCreate = " CREATE TABLE " + DT.TableName + " ("; // on récupère le nom de la table à créer foreach(DataColumn DC in DT.Columns) // on va préciser les noms et types des champs de la table { int iLong = 0; // déclaration et initialisation d'un compteur iLong = DC.ColumnName.Length; // on stocke dans l'entier iLong le nombre de caractères du nom du champ if (DC.ColumnName.Substring(0,(iLong-3)) == "_ID") // si le champ finit par "_ID" on rentre dans le si { if(DC.ColumnName.Substring(0,(iLong-3)) == DT.TableName) // si le nom du champ est le même que celui de la table on rentre dans le si { DC.ColumnName += " " + DC.DataType + " PRIMARY KEY "; // si le champ finit par _ID et porte le même nom que la table alors on le définit comme clef primaire } else // le champ finit bien par _ID mais a un nom different de la table { // formatage de la syntaxe des clefs étrangères pour les insérer dans SQL serveur DC.ColumnName += " "+DC.DataType+ " CONSTRAINT " + "FK_" + DC.ColumnName.Substring(0,(iLong-3)) + "_" + DT.TableName + " FOREIGN KEY REFERENCE " + DC.ColumnName.Substring(0,(iLong-3)) + " (" + DC.ColumnName; } } else // si le champ ne finit pas par _ID { DC.ColumnName += " " + DC.DataType; // on ajoute juste le type des données contenues dans le champ } sCreate += DC.ColumnName + ","; // dans tout les cas on ajoute une virgule et on retourne à la ligne } int iTailleInsert = sCreate.Length; sCreate = sCreate.Substring(0,(iTailleInsert-1)); // supression de la dernière virgule sCreate += ") \n"; // on referme la dernière parenthèse et on retourne à la ligne } // maintenant gérer l'affichage de l'insertion des données foreach(DataTable DT in unDS.Tables) // les opérations du foreach seront executées pour chaque table { for(int j=0;j<DT.Rows.Count;j++) // pour chaque ligne on effectue les instructions du for { sCreate += " INSERT INTO " + DT.TableName + " VALUES ( "; for(int i=0;i<DT.Columns.Count;i++) // pour chaque champ de la table on effectue cette boucle { // On stocke sous forme de chaîne toutes les données contenues dans les champs string srow = Convert.ToString(unDS.Tables[DT.TableName].Rows[j][i]); // lecture données grâce aux compteurs i et j srow = srow.Replace("'","''"); // pour éviter les problèmes de syntaxe sql on double les ' qui pourraient être situés dans les chaînes de données sCreate += "'" + srow + "'" + ","; // on formate la chaîne pour améliorer l'affichage } int iTaille = sCreate.Length; sCreate = sCreate.Substring(0,(iTaille-1)); // suppression de la dernière virgule sCreate += ") \n"; } } sCreate = sCreate.Replace("System.String","varchar(255)"); // on modifie l'affichage des types de données pour les rendre exploitables sous SQL sCreate = sCreate.Replace("System.Int32","int"); requete.Text = sCreate; // on affiche à l'écran le résultat (enfin on aimerait ...) } private void Aide(object sender, System.EventArgs e) { MessageBox.Show("Génerateur de code SQL"); } private void Requette(object sender, System.EventArgs e) { try{ Grille.DataSource = null; dtSource = null; da = null; if(requete.Text != "") { da = new SqlDataAdapter(requete.Text, MaSqlCnx); MaSqlCnx.ConnectionString = "Integrated security = SSPI ; server = CLEM_PORTABLE ; database =" + ChoixBase.SelectedItem.ToString(); //MaSqlCnx.ConnectionString = "server = votre_serveur; user id = sa ;password = your_password"; database =" + ChoixBase.SelectedItem.ToString() ;// pour un serveur distant MaSqlCnx.Open(); // ouverture de la connexion MySqlCmd.Connection = MaSqlCnx; da.Fill(ds,"toto"); // remplissage du dataser à l'aide du dataAdapter dtSource = ds.Tables[0]; // définition d'un objet datatable à partir du dataset Grille.DataSource = dtSource; // remplissage de la grille à partir du datatable } } catch(System.Exception ex) { MessageBox.Show(ex.Message); } finally { MaSqlCnx.Close(); // dans tout les cas on ferme la connexion } } private void MainFormLoad(object sender, System.EventArgs e) { //MaSqlCnx.ConnectionString = "server = votre_serveur; user id = sa ;password = your_password"; // pour un serveur distant MaSqlCnx.ConnectionString = "Integrated security = SSPI ; server = CLEM_PORTABLE"; try // on teste l'ouverture de la connexion { MaSqlCnx.Open(); // ouverture de la connexion MySqlCmd.Connection = MaSqlCnx; MySqlCmd.CommandText = "SELECT NAME FROM SYSDATABASES ORDER BY name ASC" ; SqlDataReader monSqlDR = MySqlCmd.ExecuteReader(); while(monSqlDR.Read()) { ChoixBase.Items.Add(monSqlDR.GetValue(0).ToString()) ; // à chaque base trouvée on va rajouter une option dans la list box } MaSqlCnx.Close(); } catch(System.Exception ex) { MessageBox.Show(ex.Message); } } } }

Conclusion :


Pas de bug (connu du moins) mais si vous en trouvez merci de me le faire savoir :)
webmaster@exclis.com

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.