Travail sur les bases de données, les datasets et les fichiers xml

Description

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"

Conclusion :


ajout d'un ZIP pour ceux qui préfèrent le tout fait.
Les lignes et remarques importantes sont dans la description

ajout d'un script de génération de DataBase + Tables de Test
ajout d'un scénario de démonstration

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.