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
je suis débutant en c#
je viens de tester l'application en faisant quelques modifications (j'utilise odbc pour mysql).
le fait est que j'ai une erreur que je n'arrive pas à résolver.
IL remplit bien le dataset avec le bouton fill mais quand j'ajoute une entrée et que je clique sur updateActeurs j'ai une erreur qui dit:
Exception: erreur[23000][mysql][odbc 3.51 driver][mysqld-4.0.20a-debug-log]you have an error in your sql syntax. Check the manual that corresponds to your mysql server version for the right synthax near '; SELECT id, nom, prenom FROM Acteurs WHERE (id=@id)' at line 1.
La ligne en question est:
this.sqlInsertCommand1.CommandText "INSERT INTO Acteurs(id, nom, prenom) VALUES (@id, @nom, @prenom); SELECT * FROM Acteurs WHERE (id @id)";
je ne vois pas ou est l'erreur.
pourriez vous m'aider.
merci
Quelle est la procedure à suivre pour lire le resultat d'une requete XML passer via IIS ?
Je m'explique :
J'ai le fichier schema/template suivant :
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="./FeuillesXSL/xslTaille.xsl"?>
<root xmlns:sql="urn:schemas-microsoft-com:xml-sql" >
<sql:query>
select 1 as TAG,
NULL as Parent,@@servername as [Server!1!Nom] for xml explicit
</sql:query>
<sql:query>
declare @space varchar(255)
create table #tailleDD ( drive char(1) , Libre int)
set @space='master.dbo.xp_fixeddrives'
insert into #tailleDD exec (@space)
select 1 as TAG,
NULL as Parent,
#tailleDD.drive as [Disque!1!Lecteur],
#tailleDD.Libre as [Disque!1!Espace]
from #tailleDD for XML explicit
</sql:query>
</root>
executer dans iis http://localhost/FichierSchema, j'obtiens :
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="./FeuillesXSL/xslTaille.xsl"?>
<root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Server Nom="030709-236"/>
<tailleDB Base="CellTech" Taille="9Mo"/><tailleDB Base="Plum" Taille="9Mo"/><tailleDB Base="test" Taille="50Mo"/><tailleDB Base="Total" Taille="69Mo"/>
<Disque Lecteur="C" Espace="11816"/>
</root>
comment stocké l'information dans un dataset ??
Scaythe
Je ne sais pas éxécuter le script SQL, malgré les recherches effectuées. L'aide MSDN indique:
"Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le script que vous souhaitez exécuter, puis sélectionnez Exécuter sur.". Mais je n'ai pas le menu contextuel indiqué.
Merci de votre aide.
Mais je pense qu'il nous faudra a tous encore quelques mois pour trouver toutes les "combines", les subtilites et les facilites apportees par ADO.net
Bien joue
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.