On sait généralement utiliser Visual Studio pour créer une Application Frontale.
On charge les données à partir d'une base de données ou d'un fichier XML et on les remet après modification éventuelle dans leur conteneur. Mais savez vous charger un Dataset à partir d'un Fichier XML et mettre à jour une Table avec ?
C'est ce que propose, entre autre, cet article
Rappelons la technique pour créer une représentation sous la forme de DataGrid du contenu d'une table de Base de Données. :
On recherche la table dans l'explorateur de Serveur (Serveurs SQL/Le Serveur / la DB/ la Table) et on tire la table dans la WinForm, ce qui crée des objets SqlConnection et SqlDataAdapter
On crée ensuite un DataSet typé par le menu Données/Générer le groupe de données et on lui donne le nom de dsMaTable
Reste à déposer un DataGrid sur la WinForm et à paramétrer sa DataSource sur dsMaTable.MaTable
1) Affichage :
Un bouton nommé "Fill" servira à remplir le Dataset à partir de la table. Son code :
dsMaTable.Clear();
//sqlDataAdapter1.AcceptChangesDuringFill = false; //utilisé plus tard
sqlDataAdapter1.Fill(dsMaTable);
2) Modification:
Les modifications faites par l'intermédiaire de la grille peuvent être reportées dans la Table grâce à la méthode Update de l'Adapteur :
Un bouton nommé "UpdateMaTable" fera l'affaire avec le code suivant :
try{sqlDataAdapter1.Update(dsMaTable);}
catch (Exception ex) {MessageBox.Show("Exception : " + ex.Message);}
3) Créer du XML à partir du Dataset:
On peut aisément générer un fichier XML représentant les données de la grille
Un bouton nommé "WriteXML" portera le code suivant :
if (dsMaTable.Tables[0].Rows.Count>0) dsMaTable.WriteXml("MaTable.XML");
else MessageBox.Show("Dataset Vide");
4) Lire du XML dans un Dataset:
Pour l'opération inverse, on utilisera le bouton "LoadXML" suivant :
dsMaTable.Clear();
dsMaTable.ReadXml("MaTable.XML");
5) Mettre à jour une autre Table à partir d'un Dataset:
Maintenant, il reste à charger une Table2 à partir d'un Dataset. Le Dataset peut avoir été chargé à partir d'un fichier XML ou bien d'une autre Table ayant la même structure que la table à charger. On utilisera ce bouton "UpdateTable2" :
if (dsMaTable.Tables[0].Rows.Count==0)
{ MessageBox.Show("Dataset Vide"); return ; }
try { SqlDataAdapter da = new SqlDataAdapter ("Select * from MaTable2", sqlConnection1);
SqlCommandBuilder x = new SqlCommandBuilder (da); sqlConnection1.Open(); da.Update(dsMaTable, "LaTable"); }
finally { sqlConnection1.Close(); }
Remarque :
Attention ! pour pouvoir utiliser correctement la méthode Update de l'Adapteur, il faut absolument comprendre le fonctionnement du Fill et du ReadXML:
- lors d'un Fill : tous les enregistrements (des DataRows) ont un état mis à "Unchanged"
sauf si la ligne suivante est utilisée avant le Fill
sqlDataAdapter1.AcceptChangesDuringFill = false;
auquel cas les enregistrements sont dans l'état "Added"
- lors d'un ReadXML, les enregistrements sont automatiquement à "Added"
Enfin, lors de l'Update, seuls les enregistrements modifiés (Added, Deleted ou Updated) sont pris en compte.
Autre remarque:
La ligne suivante
SqlCommandBuilder x = new SqlCommandBuilder (da);
génère les 3 commandes UPDATE, DELETE et INSERT à partir des infos fournies par le SELECT
Ce sont ces commandes qui sont appelées respectivement lorsqu'un enregistrement du Dataset est trouvé dans l'état "Modified", "Deleted" et "Added"