Vous êtes sur la page 1sur 8

ADO.

NET : Génération de données XML à partir de


données SQL Server
Cet exercice décrit la création de données à partir d’une base de données SQL Server
selon deux techniques.

1. La première utilise la méthode ExecuteXmlReader de SqlCommand pour obtenir


un objet XmlTextReader, qui est ensuite alimenté dans un DataSet à l'aide de la
méthode ReadXml de la classe DataSet.

2. La deuxième utilise l'objet SqlDataAdapter pour extraire le contenu de données et


l'adapter à la structure XML dans le DataSet. La classe SqlDataAdapter encapsule
un jeu de commandes de données et une connexion de base de données qui est
utilisée pour alimenter le DataSet et mettre à jour éventuellement la source de
données.

Cet exercice commence par l'ouverture d'une connexion à la base de données SQL
Server BDDMaster. Ensuite, une commande SQL est crée qui va sélectionner toutes les lignes
de la table Classes de la base de données BDDMaster. Dans cette commande, la clause
FOR XML est utilisée pour indiquer à SQL Server de retourner les résultats de la requête
sous forme de document XML. L'indicateur XMLDATA sur la clause FOR XML spécifie
qu'un schéma XML-Data doit être retourné. Le schéma est ajouté au document sous forme
d'un schéma inline.
E ta p e 1
Réalisation de la partie graphique
<body style="background-color: BlanchedAlmond">
<form id="form1" runat="server">
<div>
<table>
<tr>
<td><xmp id="output" runat="server"/></td>
</tr>
</table>
</div>
</form>
</body>

1/8
Etape 2(Code in line)
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.SqlClient" %>
<%@ import Namespace="System.XML" %>
<script runat="server">

Sub Page_Load(ByVal Src As Object, ByVal E As EventArgs)

Dim writer As StringWriter


writer = New StringWriter()
Console.SetOut(writer)
Run()
output.InnerHtml = writer.ToString()

End Sub

Public Sub Run()

' Paramétrage de la chaîne de connexion


Dim sSql As String ="Server=(local);Initial Catalog='BDDMaster';Trusted_Connection=True;"

Dim myConnection As SqlConnection = New SqlConnection(sSql)

' Déclaration de l'objet SqlCommand et de la requête SQL


' FOR XML indique à SQL Server de retourner les résultats
'de la requête sous forme de document XML.
' XMLDATA FOR XML spécifie qu'un schéma XML-Data doit être retourné.
Dim mySqlCommand As SqlCommand = New SqlCommand("select * from Classes FOR XML AUTO,
XMLDATA", myConnection)

Try

' Connexion à la base de données


myConnection.Open()

Dim myDataSet1 As DataSet = New DataSet()

' DataSet est une représentation de données en mémoire


' XmlReadMode.Fragment permet de lire l'objet XmlDocument
myDataSet1.ReadXml(mySqlCommand.ExecuteXmlReader(), XmlReadMode.Fragment)

' SqlDataAdapter pour extraire le contenu de données


' et l'adapter à la structure XML dans le DataSet
Dim mySqlDataAdapter As SqlDataAdapter = New SqlDataAdapter("select * from Classes",
myConnection)
Dim myDataSet2 As DataSet = New DataSet()

''Fill est appelée pour charger les données dans le dataset


mySqlDataAdapter.Fill(myDataSet2)

Console.WriteLine("Les données de sortie")


Console.WriteLine()
Console.WriteLine("********************dataset1********************")
Console.WriteLine(myDataSet1.GetXml())
Console.WriteLine()
Console.WriteLine("********************dataset2********************")
Console.WriteLine(myDataSet2.GetXml())

Catch e As Exception
Console.Write(e.ToString())
Finally
myConnection.Close()
End Try
End Sub

</script>

2/8
Accès aux données d’un fichier XML et affichage avec un
DataDrid
L’exercice suivant explique comment afficher le contenue d’un fichier Livres_webe.xml avec
un DataGrid.

<?xml version="1.0" encoding="ISO-8859-1" ?>


<livres>
<livre>
<code> L1 </code>
<auteur> Eric Ladd </auteur>
<titre> Programmation Internet : HTML, DHTML, XML et Java </titre>
</livre>
<livre>
<code> L2 </code>
<auteur> Emily Vender Veer </auteur>
<titre> Javascript pour les nuls </titre>
</livre>
<livre>
<code> L3 </code>
<auteur> Dick Oliver </auteur>
<titre> HTML et XHTML </titre>
</livre>
<livre>
<code> L4 </code>
<auteur> Lynn Kyle </auteur>
<titre> Flash4 </titre>
</livre>
<livre>
<code>L5</code>
<auteur>Alain Michard</auteur>
<titre>XML Langage et applications</titre>
</livre>
</livres>

E ta p e 1
Réalisation de la partie graphique
<html>
<body>
<h3><font face="Verdana">Données XML de la table :</font></h3>
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="900"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
EnableViewState="false"
/>
</body>
</html>

3/8
Etape 2(Code in line)
<%@ Page Language="VB" Debug="true" %>
<%@ import Namespace="System.IO" %>
<%@ import Namespace="System.Data" %>
<script runat="server">

Sub Page_Load(Sender As Object, E As EventArgs)


Dim DS As New DataSet
Dim FS As FileStream
Dim Reader As StreamReader

' FileStream permet de gérer les opérations


'de lecture et d'écriture d'un fichier
FS = New FileStream(Server.MapPath("Livres_web.xml"), FileMode.Open, FileAccess.Read)

' StreamReader pour lire des lignes


' d'informations à partir d'un fichier texte standard
Reader = New StreamReader(FS)

' ReadXml charge le dataset


DS.ReadXml(Reader)
FS.Close()

'DataView Représente une vue de DataTable personnalisée


'pouvant faire l'objet de liaisons de données
'pour le tri, la recherche, la modification et la navigation.
Dim Source As DataView
Source = New DataView(DS.Tables(0))

MyDataGrid.DataSource = Source

'DataBind() du DataGrid qui permet de


'réaliser le chargement de la liste.
MyDataGrid.DataBind()
End Sub

</script>

4/8
Enregistrement des données sous forme de fichier xml et
affichage des données xml avec un Contrôle serveur
DataList
L’objectif de cet exercice (messagerie XML) est d’enregistrer les données d’un
formulaire (nom, email et un message de commentaire) sous un fichier XML
« messages.xml » et d’afficher, à l’aide d’un DataList, le commentaire ainsi que le rédacteur
et la date de rédaction.
Contrôle serveur Web DataList
Le contrôle serveur Web DataList affiche les données dans un format que vous pouvez
définir à l'aide de modèles et de styles. Le contrôle DataList est utile pour afficher des lignes
de données. Vous pouvez éventuellement configurer le contrôle DataList de telle sorte que
les utilisateurs aient la possibilité de modifier ou de supprimer des informations. Vous pouvez
également personnaliser le contrôle afin qu'il prenne en charge d'autres fonctionnalités comme
la sélection de lignes.

Modèles de présentation du contrôle


Dans le contrôle DataList, comme le DataGrid, vous définissez la disposition de vos
informations à l'aide de modèles (Template).
Le contrôle DataList prend en charge les modèles suivants :
Modèle Description
ItemTemplate Les contrôles et les éléments HTML à rendre pour chaque ligne
de la source de données (obligatoire).
AlternatingItemTemplate Similaire à l'élément ItemTemplate mais rendu une ligne sur
deux dans le contrôle DataList. Si vous utilisez ce modèle,
l'apparence créée est généralement différente, par exemple une
couleur d'arrière-plan autre que celle du modèle ItemTemplate.
SelectedItemTemplate Les éléments à rendre lorsque l'utilisateur sélectionne un élément
dans le contrôle DataList. Ce modèle est généralement utilisé
pour mettre la ligne en évidence à l'aide d'une couleur de police
ou d'arrière-plan. Vous pouvez en outre développer l'élément en
affichant d'autres champs de la base de données.
EditItemTemplate La disposition d'un élément lorsqu'il est en mode édition. Ce
modèle contient généralement des contrôles d'édition comme les
contrôles TextBox.
HeaderTemplate et Le texte et les contrôles à rendre en début et en fin de liste.
FooterTemplate
SeparatorTemplate Les éléments à rendre entre chaque élément. Une ligne (à l'aide
d'un élément <HR>) en est un exemple.
E ta p e 1
Le fichier xml sera sous cette forme
<Messages>
<Message>
<Nom>toto</Nom>
<EMail>titi@hotmail.com</EMail>
<Contenu>toto ceci est un test comment va tu..</Contenu>
<DateMessage>18/04/2007 22:53:29</DateMessage>
</Message>
….
</Messages>

5/8
Créer un fichier « messages.xml » dans le dossier parent du projet avec seulement les
éléments racines
<Messages>
</Messages>
Les autres éléments seront créer par le programme.

E ta p e 2
Réalisation de la partie graphique

<html><body>
<form id="Form1" runat=server>
<table width="500" border="0" cellspacing="5">
<tr valign="top">
<td>Nom</td>
<td>
<asp:TextBox id="txtNom" runat=Server/>
</td>
</tr>
<tr valign="top">
<td>EMail</td>
<td>
<asp:TextBox id="txtEMail" runat=Server/>
</td>
</tr>
<tr valign="top">
<td>Commentaire</td>
<td>
<asp:TextBox id="txtComm" TextMode=Multiline Width=250 Rows=5
runat=Server/>
</td>
</tr>
<tr><td colspan=2 align=right>
<asp:Button id=btn OnClick=btn_Click Text=Enregistrer runat=Server/>
</td>
</tr>
</table>
<asp:DataList id=DLt_Message runat=Server Border="1">
<HeaderStyle
font-bold=True
forecolor="White"
backcolor="Black"/>
<HeaderTemplate>
Vos suggestions

6/8
</HeaderTemplate>
<ItemTemplate>
Message du <%# Container.DataItem.DateMessage.ToString%><br/>
De <a href="mailto:<%# Container.DataItem.EMail%>"><%#
Container.DataItem.Nom%></a>
<p><%# Container.DataItem.Contenu%></p>
</ItemTemplate>
<AlternatingItemStyle BackColor="Silver"/>
</asp:DataList>
</form>

</body></html>

Etape 3(Code in line)


<%@ Page Language="vb" Debug="true" %>
<%@ import Namespace="System.XML" %>
<script runat="server">
Class Message
Public Nom as String
Public EMail as String
Public Contenu as String
Public DateMessage as Date
End Class
Sub Page_Load(sender as Object, e as EventArgs)
If Not Page.IsPostBack Then
DtL_Message.DataSource = GetDataSource()
DtL_Message.DataBind()
End If
End Sub
Sub btn_Click(sender as Object, e as EventArgs)

Dim doc As New XmlDocument


doc.Load(Server.MapPath("Messages.XML"))
Dim mElement As XmlElement

'Crée un élément avec le nom Message.


mElement = doc.CreateElement("Message")

Dim mSousElement As XmlElement

'Crée un élément avec le nom Nom.


mSousElement = doc.CreateElement("Nom")

'définit la valeur concaténées du nœud Nom


mSousElement.InnerText = txtNom.Text

'Ajoute le noeud mSousElement en paramètre à l'arborescence du document


mElement.AppendChild(mSousElement)

'Crée un élément avec le nom EMail.


mSousElement = doc.CreateElement("EMail")
mSousElement.InnerText = txtEMail.Text
mElement.AppendChild(mSousElement)

'Crée un élément avec le nom Contenu.


mSousElement = doc.CreateElement("Contenu")
mSousElement.InnerText = txtComm.Text
mElement.AppendChild(mSousElement)

'Crée un élément avec le nom DateMessage.


mSousElement = doc.CreateElement("DateMessage")
mSousElement.InnerText = DateTime.Now.ToString
mElement.AppendChild(mSousElement)

'Ajoute le noeud mElement en paramètre à l'arborescence du document


doc.DocumentElement.AppendChild(mElement)

'Sauvegarde du document XML dans un fichier


doc.Save(Server.MapPath("Messages.XML"))

'Association des données retournées par la fonction au DataList DtL_Message


DtL_Message.DataSource = GetDataSource()
DtL_Message.DataBind()

txtNom.Text = ""

7/8
txtEMail.Text = ""
txtComm.Text = ""

End Sub

'La fonction qui permet de récupérer les données, enregistrées


' dans le fichier "Messages.XML", dans une collection ArrayList
' dont la taille change d'une façon dynamique

Function GetDataSource() As ArrayList

Dim mArray As New ArrayList


Dim doc As New XmlDocument

'Charge les données XML (Messages.XML)


doc.Load(Server.MapPath("Messages.XML"))

'Représente un noeud du document


Dim mNodeChild As XmlNode

'Représente une collection de noeuds


Dim mNodeList As XmlNodeList

'Retourne un XmlNodeList qui contient une liste de tous


' les éléments descendants correspondant au Name "Message".

mNodeList = doc.GetElementsByTagName("Message")
For Each mNodeChild In mNodeList
Dim mMessage As New Message
mMessage.Nom = mNodeChild.ChildNodes(0).InnerText
mMessage.EMail = mNodeChild.ChildNodes(1).InnerText
mMessage.Contenu = mNodeChild.ChildNodes(2).InnerText
mMessage.DateMessage = CDate(mNodeChild.ChildNodes(3).InnerText)
mArray.Add(mMessage)
Next
GetDataSource = mArray
End Function

</script>

8/8