Vous êtes sur la page 1sur 38

Premiers pas avec ADO

.NET Data Services


Version 1.0

James RAVAILLE
http://blogs.dotnet-france.com/jamesr

Premiers pas avec ADO .NET Data Services

Sommaire

Introduction ..................................................................................................................................... 3

Ralisation dune application .......................................................................................................... 4


2.1

2.1.1

Cration de la base de donnes ...................................................................................... 4

2.1.2

Alimentation de la base de donnes ............................................................................... 6

2.1.3

Architecture de lapplication ........................................................................................... 6

2.1.4

Cration des projets ........................................................................................................ 7

Cration du service daccs et de gestion des donnes .................................................................. 8


3.1

Cration du composant Entity Data Model ............................................................................. 8

3.2

Cration du service dexposition des donnes...................................................................... 14

3.3

Dfinition des rgles daccs sur les entits.......................................................................... 16

3.4

Dfinir des oprations de service .......................................................................................... 17

Affichage et gestion des donnes ................................................................................................. 19


4.1

Cration dune rfrence de service ..................................................................................... 19

4.2

Cration dune classe de contexte pour les formulaires ....................................................... 21

4.3

Cration du formulaire FrmDetailStagiaire ........................................................................... 22

4.3.1

Design du formulaire ..................................................................................................... 22

4.3.2

Code-behind du formulaire ........................................................................................... 23

4.4

Cration du formulaire FrmGestionListeStagiaires ............................................................... 25

4.4.1

Design du formulaire ..................................................................................................... 25

4.4.2

Code-behind du formulaire ........................................................................................... 27

Excution de lapplication ............................................................................................................. 35


5.1

Excution des fonctionnalits de lapplication...................................................................... 35

5.1.1

Ajout dun stagiaire ....................................................................................................... 35

5.1.2

Modification dun stagiaire ........................................................................................... 36

5.1.3

Suppression dun stagiaire ............................................................................................ 37

5.2
6

Prsentation ............................................................................................................................ 4

Observation des traces HTTP ................................................................................................ 37

Conclusion ..................................................................................................................................... 38

Dotnet France Association James RAVAILLE

Premiers pas avec ADO .NET Data Services

1 Introduction
Ce cours permet de vous montrer, comment mettre en uvre de manire pratique ADO .NET
Data Services, afin de vous permettre de comprendre ses principes fondamentaux. De manire
volontaire, nous ne rentrerons pas dans les dtails. En revanche, les chapitres suivants publis sur
Dotnet-France, dtailleront chacune des parties de ce document.
Ce cours se dcompose de la manire suivante :
-

Prsentation de lapplication de gestion, cre tout au long de ce cours.


Cration du service de gestion de donnes ADO .NET. Ce service de donnes exposera les
donnes obtenues au travers dun modle de donnes, cr avec le Framework Entity. Pour
une bonne comprhension de ce cours, nous vous recommandons de consulter les cours
publis sur Dotnet-France sur ce sujet.
Cration dune application Windows Forms, qui affiche et gre les donnes, au travers du
service de donnes ADO .NET.

Dotnet France Association James RAVAILLE

Premiers pas avec ADO .NET Data Services

2 Ralisation dune application


2.1 Prsentation
Lapplication que nous allons dvelopper tout au long de ce cours, aura pour but de consulter
et de grer une liste de stagiaires, et des cours auxquels ils sont inscrits. Elle sera constitue de deux
formulaires :
-

2.1.1

Un affichant la liste des stagiaires.


Un affichant les informations sur un stagiaire.

Cration de la base de donnes

2.1.1.1 Le modle conceptuel de donnes


Le modle conceptuel des donnes (aussi appel MCD) permet de reprsenter de faon
formelle, sous forme dun schma, les donnes qui seront utilises par une application. Ce schma
est compos dentits, relies entre elles par des relations dassociation.
Voici le modle conceptuel de donnes de notre application :
Stagiaire
PK

Identifiant

Cours

0..n
Suit

0..n PK Identifiant

Nom
Prenom

Libelle
NombreJours

Ce modle dcrit les entits Stagiaire et Cours. Il met aussi en vidence :


-

Quun stagiaire peut suivre un ou plusieurs cours.


Quun cours peut tre suivi par aucun, un ou plusieurs stagiaires.

2.1.1.2 Le modle logique de donnes


Nous allons maintenant crer le modle logique de donnes. La relation n-aire bilatrale
entre les tables Stagiaire et Cours entrane la cration dune table supplmentaire, que nous
appelons Stagiaire2Cours. Cette table agrge les champs constituant la cl primaire des tables Cours
et Stagiaire. Le modle logique de donnes obtenu est donc le suivant :

Pour crer ce schma de base de donnes, lancer SQL Server Management Studio (interface
dadministration de SQL Server). Crez une base de donnes nomme DotnetFrance, puis dans une
fentre de requte, excutez le jeu dinstructions Transact-SQL suivant :
Dotnet France Association James RAVAILLE

Premiers pas avec ADO .NET Data Services

-- SQL
USE DotnetFrance
CREATE TABLE [dbo].[Stagiaire](
[Identifiant] [int] IDENTITY(1,1) NOT NULL,
[Nom] [varchar](50) NOT NULL,
[Prenom] [varchar](50) NOT NULL,
CONSTRAINT [PK_Stagiaire] PRIMARY KEY CLUSTERED
(
[Identifiant] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY],
CONSTRAINT [UQ__Stagiaire__7F60ED59] UNIQUE NONCLUSTERED
(
[Identifiant] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Cours](
[Identifiant] [int] IDENTITY(1,1) NOT NULL,
[Libelle] [varchar](50) NOT NULL,
[NombreJours] [int] NOT NULL,
CONSTRAINT [PK_Cours] PRIMARY KEY CLUSTERED
(
[Identifiant] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY],
CONSTRAINT [UQ__Cours__023D5A04] UNIQUE NONCLUSTERED
(
[Identifiant] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Stagiaire2Cours](
[IdStagiaire] [int] NOT NULL,
[IdCours] [int] NOT NULL,
CONSTRAINT [PK_Stagiaire2Cours] PRIMARY KEY CLUSTERED
(
[IdStagiaire] ASC,
[IdCours] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Stagiaire2Cours] WITH CHECK ADD
[FK_Stagiaire2Cours_Cours] FOREIGN KEY([IdCours])
REFERENCES [dbo].[Cours] ([Identifiant])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

CONSTRAINT

ALTER TABLE [dbo].[Stagiaire2Cours] WITH CHECK ADD CONSTRAINT


[FK_Stagiaire2Cours_Stagiaire] FOREIGN KEY([IdStagiaire])
REFERENCES [dbo].[Stagiaire] ([Identifiant])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

Dotnet France Association James RAVAILLE

Premiers pas avec ADO .NET Data Services


Voici une brve description des tables :
-

2.1.2

Stagiaire : contient toutes les informations relatives aux stagiaires.


Cours : contient toutes les informations relatives aux cours. Les stagiaires doivent suivre des
cours afin de pouvoir travailler sur un projet dun client.
Stagiaire2Cours : permet de lier les stagiaires un cours. Un stagiaire peut assister
plusieurs cours, et un cours peut concerner plusieurs stagiaires.

Alimentation de la base de donnes


Voici un jeu dinstructions Transact-SQL, permettant dalimenter les tables en donnes :

-- SQL
-- Alimentation de la table des stagiaires.
INSERT INTO Stagiaire(Nom, Prenom) VALUES ('DEROUX', 'Alain')
INSERT INTO Stagiaire(Nom, Prenom) VALUES ('RAVAILLE', 'James')
INSERT INTO Stagiaire(Nom, Prenom) VALUES ('SIRON', 'Karl')
INSERT INTO Stagiaire(Nom, Prenom) VALUES ('EMATO', 'Julie')
-- Alimentation de la table des stagiaires.
INSERT INTO Cours (Libelle, NombreJours) VALUES
Administration de serveurs', 5)
INSERT INTO Cours (Libelle, NombreJours) VALUES
INSERT INTO Cours (Libelle, NombreJours) VALUES
INSERT INTO Cours (Libelle, NombreJours) VALUES
INSERT INTO Cours (Libelle, NombreJours) VALUES
-- Affectation des cours aux stagiaires.
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,
INSERT INTO Stagiaire2Cours (IdStagiaire,

2.1.3

('SQL Server ('XHTML / CSS', 3)


('C#', 5)
('ASP .NET 3.5', 5)
('ASP .NET AJAX', 3)

IdCours)
IdCours)
IdCours)
IdCours)
IdCours)
IdCours)
IdCours)
IdCours)
IdCours)
IdCours)
IdCours)

VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES

Architecture de lapplication
Voici larchitecture de lapplication :

Dotnet France Association James RAVAILLE

(1,
(1,
(2,
(2,
(2,
(2,
(3,
(3,
(3,
(4,
(4,

1)
3)
2)
1)
3)
4)
1)
4)
5)
4)
5)

Premiers pas avec ADO .NET Data Services

Client_DataServices
Windows Forms

DotnetFrance_DataServices
Projet Web

DotnetFrance

Lapplication est compose de deux projets :


-

2.1.4

Client_DataServices : projet permettant dafficher les donnes de la base de donnes


DotnetFrance, et dinteragir avec les utilisateurs pour grer ces donnes.
DotnetFrance_DataServices : projet Web, contenant le service de donnes ADO .NET,
permettant de consulter et de grer les donnes dans la base de donnes DotnetFrance.

Cration des projets


Dans Visual Studio 2008, crons deux projets :
Un projet de type Windows Forms, nomm Client_DataServices. Dfinir ce projet comme
projet de dmarrage.
Un projet de type Site Web, nomm DotnetFrance_DataServices.

Dotnet France Association James RAVAILLE

Premiers pas avec ADO .NET Data Services

3 Cration du service daccs et de gestion des donnes


Dans ce chapitre, nous allons crer le service daccs aux donnes avec ADO .NET Data
Services. Les tapes de cration de ce service sont les suivantes :
-

Cration dun modle dentits.


Cration du service dexposition des donnes.

3.1 Cration du composant Entity Data Model


Dans le projet DotnetFrance_DataServices, commenons par ajouter un composant de type
Entity Data Model, nomm DotnetFrance. Ce composant constituera notre modle dentits, qui sera
utilis ultrieurement par notre service de donnes ADO .NET :

Aprs avoir valid, la fentre suivante apparat :

Dotnet France Association James RAVAILLE

Premiers pas avec ADO .NET Data Services

Cliquons sur le bouton oui , pour simplifier le dveloppement et lutilisation ultrieure de


ce service. La fentre suivante apparat alors :

Nous allons crer notre composant daccs et gestion de donnes partir de notre base de
donnes DotnetFrance. Nous slectionnons alors litem Gnrer partir de la base de donnes ,
et cliquons sur le bouton Suivant . La fentre suivante apparat :

Dotnet France Association James RAVAILLE

10

Premiers pas avec ADO .NET Data Services

Dans cette fentre, choisir une connexion pointant vers notre base de donnes, ou alors
crer une nouvelle connexion en cliquant sur le bouton Nouvelle connexion . Dans le second cas,
la fentre suivante apparat :

Dotnet France Association James RAVAILLE

11

Premiers pas avec ADO .NET Data Services

Dans cette fentre, saisir le nom de votre instance SQL Server, sur laquelle votre base de
donnes est hberge. Puis choisissez votre mode dauthentification, ainsi que la base de donnes.
Cliquer sur le bouton Tester la connexion , afin de vrifier si toutes ces informations sont
correctes. Cela est ncessaire, car elles seront utilises pour crer la chane de connexion. Une fois
cette fentre valide, nous revenons la fentre suivante :

Dotnet France Association James RAVAILLE

12

Premiers pas avec ADO .NET Data Services

Cliquer alors sur le bouton Suivant . La fentre suivante apparat :

Dotnet France Association James RAVAILLE

13

Premiers pas avec ADO .NET Data Services

Choisissons les tables, vues et procdures stockes, que nous allons utiliser dans notre
modle dentits. Dans notre exemple, nous allons grer les donnes contenues dans les tables
Cours, Stagiaires et Stagiaire2Cours, que nous slectionnons. Cliquons ensuite sur le bouton
Terminer .Le model suivant apparat :

Vous pouvez observer que la table de liaison Stagiaire2Cours, prsente dans le modle
logique de donnes de la base de donnes, nest pas prsente. En effet, le Framework Entity se base
sur une vision conceptuelle de la base de donnes.
Limplmentation de ces classes est contenue dans le fichier DotnetFrance.Designer.cs ou
DotnetFranceEntities.vb. En ouvrant ce fichier, on peut remarquer :

Dotnet France Association James RAVAILLE

14

Premiers pas avec ADO .NET Data Services


-

Que
toutes
les
classes
dentit
drivent
de
la
classe
System.Data.Objects.DataClasses.EntityObject.
Quune classe supplmentaire est gnre. Elle porte le mme nom que le composant Entity
Data Model prcdemment cr, suffix par Entities . Cette classe joue un rle essentiel
dans laccs et la gestion des entits, car elle permet :
o De dfinir un ensemble de membres communs.
o De charger les entits dans un contexte de donnes.
o Deffectuer un suivi des modifications effectues sur les entits.
o

Ces informations sont importantes, car elles devront tre utilises ultrieurement, lors de la
cration de lapplication Windows Forms, consommant notre service de donnes.

3.2 Cration du service dexposition des donnes


A la racine du projet DotnetFrance_DataServices, ajoutons un composant de type Service de
donnes ADO .NET, nomm DataAcesssService.svc :

La cration de ce composant provoque la cration dun service WCF (Windows


Communication Foundation), compos :
-

Du point dentre du service, reprsent par le fichier DataAcesssService.svc.


Du fichier DataAcesssService.cs, contenu dans le rpertoire App_Code, contenant la classe
darrire plan de notre service, dont le code est le suivant (par dfaut) :

Dotnet France Association James RAVAILLE

15

Premiers pas avec ADO .NET Data Services

// C#
using
using
using
using
using

System;
System.Data.Services;
System.Collections.Generic;
System.Linq;
System.ServiceModel.Web;

public class DataAccessService : DataService< /* TODO : placez ici le nom


de votre classe source de donnes */ >
{
// Cette mthode n'est appele qu'une seule fois pour initialiser les
stratgies au niveau des services.
public static void InitializeService(IDataServiceConfiguration
config)
{
// TODO : dfinissez des rgles pour indiquer les jeux d'entits
et oprations de service visibles, pouvant tre mis jour, etc.
// Exemples :
// config.SetEntitySetAccessRule("MyEntityset",
EntitySetRights.AllRead);
// config.SetServiceOperationAccessRule("MyServiceOperation",
ServiceOperationRights.All);
}
}

' VB .NET
Imports System.Data.Services
Imports System.Linq
Imports System.ServiceModel.Web
Public Class DataAccessService
' TODO : remplacez [[class name]] par le nom de votre classe de
donnes
Inherits DataService(Of [[class name]])
' Cette mthode n'est appele qu'une seule fois pour initialiser les
stratgies au niveau des services.
Public Shared Sub InitializeService(ByVal config As
IDataServiceConfiguration)
' TODO : dfinissez des rgles pour indiquer les jeux d'entits
et oprations de service visibles, pouvant tre mis jour, etc.
' Exemples :
' config.SetEntitySetAccessRule("MyEntityset",
EntitySetRights.AllRead)
' config.SetServiceOperationAccessRule("MyServiceOperation",
ServiceOperationRights.All)
End Sub
End Class

La classe de notre composant daccs aux donnes ADO .NET tend la classe gnrique
System.Data.Services.DataService<T>. Elle sera le point d'entre principal pour notre service de donnes
ADO .NET. Le type prcis en paramtre correspond la classe permettant daccder et grer les
donnes. Dans notre cas, il sagit de la classe de gestion des entits : DotnetFranceEntities. La
dfinition de la classe obtenue est alors la suivante :

Dotnet France Association James RAVAILLE

16

Premiers pas avec ADO .NET Data Services

// C#
using DotnetFranceModel;
public class DataAccessService : DataService<DotnetFranceEntities>
{
}

' VB .NET
Imports DotnetFranceModel
Public Class DataAccessService
Inherits DataService(Of DotnetFranceEntities)
End Class

La classe DataAccessService contient une mthode statique nomme InitializeService, et


acceptant en paramtre un objet de type IDataServiceConfiguration. Ce paramtre permet de dfinir
les autorisations sur les entits et les verbes HTTP autoriss.

3.3 Dfinition des rgles daccs sur les entits


Notre modle dentits permet daccder et grer deux types dentits : des stagiaires et des
cours. Nous allons dfinir les rgles suivantes :
-

Autoriser la lecture / ajout / modification / suppression des stagiaires.


Autoriser uniquement la lecture des cours, auxquels les stagiaires sont inscrits.
Dans la mthode InitializeService, nous ajoutons les instructions suivantes :

// C#
public static void InitializeService(IDataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Stagiaire", EntitySetRights.All);
config.SetEntitySetAccessRule("Cours", EntitySetRights.AllRead);
}

' VB .NET
Public Shared Sub InitializeService(ByVal config As
IDataServiceConfiguration)
config.SetEntitySetAccessRule("Stagiaire", EntitySetRights.All)
config.SetEntitySetAccessRule("Cours", EntitySetRights.AllRead)
End Sub

Dotnet France Association James RAVAILLE

17

Premiers pas avec ADO .NET Data Services

3.4 Dfinir des oprations de service


Dans la classe de votre service de donnes ADO .NET, vous pouvez ajouter une opration de
service, en ajoutant une mthode, qui doit respecter les caractristiques suivantes :
-

Elle doit tre publique.


Pour les dveloppeurs C#, elle ne doit possder que des paramtres dentre (paramtres de
sortie interdits).
Il peut sagir dune procdure. Si elle est une fonction, le type de retour doit tre les
interfaces gnriques IEnumerable<T> ou IQueryable<T>, o T ou une classe primitive telle
qu'un entier ou une chane de caractres.
Elle doit tre dfinie avec l'un des attributs de mthode suivants :
o WebGet : permet d'appeler la mthode l'aide dune requte HTTP de type GET.
o WebInvoke : permet d'appeler la mthode l'aide dune requte de type HTTP de
type POST, PUT, MERGE, DELETE.

Voici un exemple : soit une mthode, permettant dobtenir le nombre de stagiaires tant
inscrit au moins un cours :
// C#
public class DataAccessService : DataService<DotnetFranceEntities>
{
// Cette mthode n'est appele qu'une seule fois pour initialiser les
stratgies au niveau des services.
public static void InitializeService(IDataServiceConfiguration
config)
{
config.SetEntitySetAccessRule("Stagiaire", EntitySetRights.All);
config.SetEntitySetAccessRule("Cours", EntitySetRights.AllRead);
config.SetServiceOperationAccessRule("GetNombreStagiairesInscrits",
ServiceOperationRights.All);
}
[WebGet]
public int GetNombreStagiairesInscrits()
{
return this.CurrentDataSource.Stagiaire
.Count(oStagiaire => oStagiaire.Cours.Count > 0);
}
}

Dotnet France Association James RAVAILLE

18

Premiers pas avec ADO .NET Data Services

' VB .NET
Public Class DataAcesssService
Inherits DataService(Of DotnetFranceEntities)
' Cette mthode n'est appele qu'une seule fois pour initialiser les
stratgies au niveau des services.
Public Shared Sub InitializeService(ByVal config As
IDataServiceConfiguration)
config.SetEntitySetAccessRule("Stagiaire", EntitySetRights.All)
config.SetEntitySetAccessRule("Cours", EntitySetRights.AllRead)
config.SetServiceOperationAccessRule("GetNombreStagiairesInscrits",
ServiceOperationRights.All)
End Sub
<WebGet()> _
Public Function GetNombreStagiairesInscrits() As Integer
Return Me.CurrentDataSource.Stagiaire.Count(Function(oStagiaire)
oStagiaire.Cours.Count > 0)
End Function
End Class

Dotnet France Association James RAVAILLE

19

Premiers pas avec ADO .NET Data Services

4 Affichage et gestion des donnes


Dans le projet Client_DataServices, nous allons crer des formulaires daffichage et de
gestion des donnes contenues dans la base de donnes DotnetFrance, au travers de notre service de
donnes ADO .NET.
Le projet Client_DataServices est compos de deux formulaires :
-

Un formulaire nomm FrmGestionListeStagiaires. Il permet de consulter et grer la liste des


stagiaires.
Un formulaire nomm FrmDetailStagiaire, qui permet de consulter / modifier les
informations relatives un stagiaire. Ce formulaire sera aussi utilis pour ajouter un
stagiaire.

Afin de pouvoir utiliser les classes dentit dans le projet DotnetFrance_IHM, il est ncessaire
dajouter une rfrence vers lassembly System.Data.Entity.dll du Framework .NET.

4.1 Cration dune rfrence de service


Pour accder et modifier les donnes, lapplication Client_DataServices devra consommer le
service DataAccessService contenu dans lapplication DotnetFrance_DataServices. Pour ce faire, il est
ncessaire dajouter dans le projet Client_DataServices une rfrence de service vers ce mme
service. Dans lexplorateur de solution, affichons alors le menu contextuel du rpertoire Service
References, et cliquons sur litem Ajouter une rfrence de service . La fentre suivante
apparat :

Dotnet France Association James RAVAILLE

20

Premiers pas avec ADO .NET Data Services


Dans cette fentre, recherchez ou spcifiez lurl du service de donnes rfrences. Puis,
spcifier le nom de la rfrence de service : RefDotnetFrance_DataServices. Puis cliquez sur le
bouton OK, pour valider la cration de cette rfrence de service. Les modifications suivantes sont
alors apportes au projet :
-

Dans lexplorateur de solution :

Ajout automatique des rfrences suivantes vers des composants du Framework .NET :
o System.Data.Services.Client.dll
o System.Runtime.Serialization.dll

La rfrence de service cre ci-dessus cre diffrents fichiers dans lapplication (affichez
tous les fichiers dans lexplorateur de solutions pour lobserver :

Le fichier Reference.cs/Reference.vb contient trois classes proxy, contenues dans lespace de


noms Client_DataServices.RefDotnetFrance_DataServices : DotnetFranceEntities, Stagiaire et Cours.
Ces classes exposent les classes dentits exposes par le service de donnes ADO .NET. Dans les
formulaires, nous manipulerons des objets crs partir de ces classes, pour afficher et grer les

Dotnet France Association James RAVAILLE

21

Premiers pas avec ADO .NET Data Services


donnes. Et travers ces objets, nous consommerons le service de donnes ADO .NET, que vous
venons de crer.

4.2 Cration dune classe de contexte pour les formulaires


Diffrents formulaires de notre application, vont partager des donnes et des fonctionnalits
communes. Dans notre cas, nous allons partager une instance du contexte de donnes, que nous
utiliserons pour lire et modifier les donnes.
Pour faciliter ce partage, nous allons crer une classe de contexte que nous appellerons
FrmContexte. Cette classe drive de la clase System.Windows.Forms.Form du Framework .NET, et
sera la classe de base des deux autres formulaires de notre application. On obtient alors le
diagramme de classes suivant :

A la racine du projet Client_DataServices, nous ajoutons un rpertoire nomm Contexte,


dans lequel nous ajoutons un formulaire Windows nomm FrmContexte. Chaque instance de
lapplication qui sexcute, doit possder une seule instance du contexte de donnes, cette instance
devant tre unique pour tous les formulaires de lapplication. Ainsi, dans le formulaire FrmContexte,
on ajoute le singleton suivant :

Dotnet France Association James RAVAILLE

22

Premiers pas avec ADO .NET Data Services

' VB .NET
Private Shared _ContexteDonnees As DotnetFranceEntities
Protected Shared Property ContexteDonnees() As DotnetFranceEntities
Get
If (FrmContexte._ContexteDonnees Is Nothing) Then
FrmContexte._ContexteDonnees = New DotnetFranceEntities(New
Uri(ConfigurationManager.AppSettings("UrlServiceDonnees")))
End If
Return FrmContexte._ContexteDonnees
End Get
Private Set(ByVal value As DotnetFranceEntities)
End Set
End Property

Le contexte de donnes de lapplication est cr une seule fois, lors du premier accs. Vous
remarquez quil est instanci avec une chane de caractre, correspondant lURL de notre service
de donnes. Cette URL est dfinie dans le fichier de configuration de lapplication. Ainsi, vous devez :
-

Ajouter un fichier de configuration, et y dfinir le contenu suivant :

' Fichier de configuration


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="UrlServiceDonnees"
value="http://localhost/DotnetFrance_DataServices/DataAccessService.svc"/>
</appSettings>
</configuration>

Ajouter une rfrence vers le composant System.Configuration.dll du Framework .NET.


Importer lespace de nom System.Configuration, afin de pouvoir utiliser la classe
ConfigurationManager.

4.3 Cration du formulaire FrmDetailStagiaire


4.3.1

Design du formulaire
Voici une prsentation de ce formulaire :

Dotnet France Association James RAVAILLE

23

Premiers pas avec ADO .NET Data Services

TxtIdentifiant
TxtNom
TxtPrenom

LstCours

CmdValider

CmdAnnuler

Voici quelques proprits des contrles de ce formulaire :


Contrles
TxtIdentifiant

Proprits

Valeurs

ReadOnly

True

AllowUserToAddRows
AllowUserToDeleteRows
Columns

False
False
Ajout de deux colonnes :
- Libelle : lie la proprit Libelle
- Dure : lie la proprit NombreJours
BdsCours
False
True
false
FullRowSelect

LstCours

DataSource
MultiSelect
ReadOnly
RowHeadersVisible
SelectionMode
4.3.2

Code-behind du formulaire
Ce formulaire va grer les informations concernant les stagiaires. Nous allons donc :
Crer un attribut de type Stagiaire, avec son accesseur.
Initialiser cet attribut dans le constructeur.
Implmenter lvnement Load, de manire utiliser le databinding pour :

Dotnet France Association James RAVAILLE

24

Premiers pas avec ADO .NET Data Services


o

Afficher lidentifiant. Dans le cas dun ajout dun stagiaire, les caractres -- seront
affichs. En effet, la colonne Identifiant de la table Stagiaire tant une colonne
identit, lidentifiant du stagiaire sera dtermin par SQL Server lors de lajout du
stagiaire.
o Afficher le nom, prnom, et la liste des cours auxquels le stagiaire est inscrit.
Implmenter lvnement Click sur le bouton CmdValider, afin denregistrer que lutilisateur
confirme lajout / modification du stagiaire.
Implmenter lvnement Click sur le bouton CmdAnnuler, afin denregistrer que lutilisateur
annule lajout / modification du stagiaire.
Voici le code behind de ce formulaire :

// C#
public partial class FrmDetailStagiaire : FrmContexte
{
private Stagiaire _oStagiaire;
public Stagiaire oStagiaire
{
get { return _oStagiaire; }
set { _oStagiaire = value; }
}
public FrmDetailStagiaire(Stagiaire aStagiaire)
{
InitializeComponent();
// Initialisation des attributs.
this.oStagiaire = aStagiaire;
}
private void FrmDetailStagiaire_Load(object sender, EventArgs e)
{
if (oStagiaire.Identifiant == 0)
{
TxtIdentifiant.Text = "--";
}
else
{
TxtIdentifiant.DataBindings.Add("Text", this.oStagiaire,
"Identifiant");
}
TxtNom.DataBindings.Add("Text", this.oStagiaire, "Nom");
TxtPrenom.DataBindings.Add("Text", this.oStagiaire, "Prenom");
BdsCours.DataSource = this.oStagiaire.Cours;
}
private void CmdValider_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
private void CmdAnnuler_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}

Dotnet France Association James RAVAILLE

25

Premiers pas avec ADO .NET Data Services

' VB .NET
Public Class FrmDetailStagiaire
Private _oStagiaire As Stagiaire
Private Property oStagiaire() As Stagiaire
Get
Return Me._oStagiaire
End Get
Set(ByVal value As Stagiaire)
Me._oStagiaire = value
End Set
End Property
Public Sub New(ByVal aStagiaire As Stagiaire)
' Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
' Ajoutez une initialisation quelconque aprs l'appel
InitializeComponent().
Me.oStagiaire = aStagiaire
End Sub
Private Sub FrmDetailStagiaire_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
If (oStagiaire.Identifiant = 0) Then
TxtIdentifiant.Text = "--"
Else
TxtIdentifiant.DataBindings.Add("Text", Me.oStagiaire,
"Identifiant")
End If
TxtNom.DataBindings.Add("Text", Me.oStagiaire, "Nom")
TxtPrenom.DataBindings.Add("Text", Me.oStagiaire, "Prenom")
BdsCours.DataSource = Me.oStagiaire.Cours
End Sub
Private Sub CmdValider_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles CmdValider.Click
Me.DialogResult = DialogResult.OK
End Sub
Private Sub CmdAnnuler_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles CmdAnnuler.Click
Me.DialogResult = DialogResult.Cancel
End Sub
End Class

4.4 Cration du formulaire FrmGestionListeStagiaires


4.4.1

Design du formulaire
Voici une prsentation de ce formulaire :

Dotnet France Association James RAVAILLE

26

Premiers pas avec ADO .NET Data Services


LstStagiaires

CmdFermer

Voici quelques proprits des contrles de ce formulaire :


Contrles
LstStagiaires

Proprits

Valeurs

AllowUserToAddRows
AllowUserToDeleteRows
Columns

False
False
Ajout de quatre colonnes :
- Nom : lie la proprit Nom
- Prnom : lie la proprit Prenom
- Nombre de cours : NombreCours
- Nombre
de
jours
de
NombreJoursDeCours
BdsStagiaires
False
True
False
FullRowSelect

DataSource
MultiSelect
ReadOnly
RowHeadersVisible
SelectionMode

cours :

Le contrle de type BindingSource nomm BdsStagiaire, permet de simplifier la mise en


uvre du databinding dans notre formulaire. Nous lutiliserons pour :
-

Afficher la liste des stagiaires et des informations connexes.


Ajouter / modifier / supprimer un stagiaire dans/de la liste.
Obtenir tout moment un objet mtier (entit, objet fortement typ) correspondant au
stagiaire slectionn dans la liste.

Le contrle de type ContextMenuStrip nomm MnuStagiaire, permet dafficher un menu


contextuel sur un stagiaire slectionn dans la liste. Les items de ce menu permettent dajouter,
modifier et supprimer un stagiaire.

Dotnet France Association James RAVAILLE

27

Premiers pas avec ADO .NET Data Services

4.4.2

Code-behind du formulaire

4.4.2.1 Pour obtenir lentit du stagiaire courante


Nous allons crer un accesseur en lecture seule, permettant dobtenir lentit du stagiaire
slectionn dans la liste :
// C#
private Stagiaire StagiaireCourant
{
get
{
return (Stagiaire)BdsStagiaires.Current;
}
}

' VB .NET
Private ReadOnly Property StagiaireCourant() As Stagiaire
Get
Return CType(BdsStagiaires.Current, Stagiaire)
End Get
End Property

4.4.2.2 Lors du chargement du formulaire


Lors du chargement du formulaire, obtenir et afficher la liste des stagiaires. Pour ce faire,
nous faisons appel la mthode statique GetListeInstances de la classe Stagiaire de notre modle
dentits :
// C#
private void FrmListeStagiaires_Load(object sender, EventArgs e)
{
try
{
// Affichage de la liste des stagiaires.
BdsStagiaires.DataSource = ContexteDonnees.Stagiaire.ToList();
}
catch (Exception aEx)
{
MessageBox.Show(aEx.Message);
}
}

Dotnet France Association James RAVAILLE

28

Premiers pas avec ADO .NET Data Services

' VB .NET
Private Sub FrmGestionListeStagiaires_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
Try
' Affichage de la liste des stagiaires.
BdsStagiaires.DataSource = ContexteDonnees.Stagiaire.ToList()
Catch aEx As Exception
MessageBox.Show(aEx.Message)
End Try
End Sub

4.4.2.3 Pour fermer le formulaire


Voici limplmentation de lvnement Click sur le bouton intitul Fermer :
// C#
private void CmdFermer_Click(object sender, EventArgs e)
{
// Fermeture du formulaire.
this.Close();
}

' VB .NET
Private Sub CmdFermer_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles CmdFermer.Click
' Fermeture du formulaire.
Me.Close()
End Sub

4.4.2.4 Gestion de laffichage du menu


Le menu contextuel sur un stagiaire doit tre affich, uniquement un stagiaire est slectionn
dans la liste. Voici limplmentation de lvnement Opening sur le menu MnuStagiaire :
// C#
private void MnuStagiaire_Opening(object sender, CancelEventArgs e)
{
// Si aucun stagiaire n'est slectionn, alors on n'affiche pas le
menu contextuel.
e.Cancel = this.StagiaireCourant == null;
}

Dotnet France Association James RAVAILLE

29

Premiers pas avec ADO .NET Data Services

' VB .NET
Private Sub MnuStagiaire_Opening(ByVal sender As System.Object, ByVal e
As System.ComponentModel.CancelEventArgs) Handles MnuStagiaire.Opening
' Si aucun stagiaire n'est slectionn, alors on n'affiche pas le
menu contextuel.
e.Cancel = Me.StagiaireCourant Is Nothing
End Sub

4.4.2.5 Ajouter un stagiaire


Pour ajouter un stagiaire, nous crons une instance de classe Stagiaire de notre modle
dentits. Puis, nous grons les donnes contenues dans cet objet, via une instance du formulaire
FrmDetailStagiaire. Aprs la fermeture cette fentre, si lutilisateur a cliqu sur le bouton Valider,
alors le stagiaire est ajout dans la table Stagiaire du contexte de donnes, puis enregistr dans la
base de donnes.
// C#
private void ajouterToolStripMenuItem_Click(object sender, EventArgs e)
{
// Variables locales.
Stagiaire oStagiaire;
FrmDetailStagiaire oForm;
DialogResult oResult;
try
{
// Initialisation.
oStagiaire = new Stagiaire();
// Cration du formulaire de dtail sur un stagiaire.
oForm = new FrmDetailStagiaire(oStagiaire);
// Affichage.
oResult = oForm.ShowDialog();
if (oResult == DialogResult.OK)
{
// Ajout du stagiaire en base de donnes.
ContexteDonnees.AddToStagiaire(oStagiaire);
ContexteDonnees.SaveChanges();
// Affichage du stagiaire dans la grille.
BdsStagiaires.Add(oStagiaire);
}
}
catch (Exception aEx)
{
MessageBox.Show(aEx.Message);
}
}

Dotnet France Association James RAVAILLE

30

Premiers pas avec ADO .NET Data Services

' VB .NET
Private Sub ajouterToolStripMenuItem_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ajouterToolStripMenuItem.Click
' Variables locales.
Dim oStagiaire As Stagiaire
Dim oForm As FrmDetailStagiaire
Dim oResult As DialogResult
Try
' Initialisation.
oStagiaire = New Stagiaire()
' Cration du formulaire de dtail sur un stagiaire.
oForm = New FrmDetailStagiaire(oStagiaire)
' Affichage.
oResult = oForm.ShowDialog()
If (oResult = DialogResult.OK) Then
' Ajout du stagiaire en base de donnes.
ContexteDonnees.AddToStagiaire(oStagiaire)
ContexteDonnees.SaveChanges()
' Affichage du stagiaire dans la grille.
BdsStagiaires.Add(oStagiaire)
End If
Catch aEx As Exception
MessageBox.Show(aEx.Message)
End Try
End Sub

4.4.2.6 Modifier un stagiaire


Pour modifier un stagiaire, nous rcuprons une instance de classe Stagiaire via notre
accesseur StagiaireCourant. Puis, nous grons les donnes contenues dans cet objet, via une instance
du formulaire FrmDetailStagiaire. Aprs la fermeture cette fentre, si lutilisateur a cliqu sur le
bouton Valider, alors les modifications effectues sur le stagiaire sont enregistres dans le contexte
de donnes, puis persistes dans la base de donnes. Le cas chant, ces modifications effectues sur
les proprits du stagiaire sont annules.

Dotnet France Association James RAVAILLE

31

Premiers pas avec ADO .NET Data Services

// C#
private void modifierToolStripMenuItem_Click(object sender, EventArgs e)
{
// Variables locales.
Stagiaire oStagiaire;
FrmDetailStagiaire oForm;
DialogResult oResult;
try
{
// Initialisation.
oStagiaire = this.StagiaireCourant;
if (oStagiaire != null)
{
// Cration du formulaire de dtail sur un stagiaire.
oForm = new FrmDetailStagiaire(oStagiaire);
// Affichage.
oResult = oForm.ShowDialog();
if (oResult == DialogResult.OK)
{
// Enregistrement des modifications dans la base de
donnes.
ContexteDonnees.UpdateObject(oStagiaire);
ContexteDonnees.SaveChanges();
}
else
{
// Annulation des modifications.
ContexteDonnees.LoadProperty(oStagiaire, "Nom");
ContexteDonnees.LoadProperty(oStagiaire, "Prenom");
BdsStagiaires.ResetCurrentItem();
}
}
}
catch (Exception aEx)
{
MessageBox.Show(aEx.Message);
}
}

Dotnet France Association James RAVAILLE

32

Premiers pas avec ADO .NET Data Services

' VB .NET
Private Sub modifierToolStripMenuItem_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
modifierToolStripMenuItem.Click
' Variables locales.
Dim oStagiaire As Stagiaire
Dim oForm As FrmDetailStagiaire
Dim oResult As DialogResult
Try
' Initialisation.
oStagiaire = Me.StagiaireCourant
' Cration du formulaire de dtail sur un stagiaire.
oForm = New FrmDetailStagiaire(oStagiaire)
' Affichage.
oResult = oForm.ShowDialog()
If (oResult = DialogResult.OK) Then
' Enregistrement des modifications dans la base de donnes.
ContexteDonnees.UpdateObject(oStagiaire)
ContexteDonnees.SaveChanges()
Else
' Annulation des modifications.
ContexteDonnees.LoadProperty(oStagiaire, "Nom");
ContexteDonnees.LoadProperty(oStagiaire, "Prenom");
BdsStagiaires.ResetCurrentItem();
End If
Catch aEx As Exception
MessageBox.Show(aEx.Message)
End Try
End Sub

4.4.2.7 Supprimer un stagiaire


Pour supprimer un stagiaire, nous rcuprons une instance de classe Stagiaire via notre
accesseur StagiaireCourant. Une demande de confirmation est effectue. Si lutilisateur valide son
choix de suppression, alors le stagiaire est supprim de la base de donnes.
Notez que dans la base de donnes, toutes les relations dassociation entres les tables de
notre modle acceptent la suppression en cascade. De ce fait, nous ne supprimons pas les
inscriptions des stagiaires aux cours, avant de supprimer un stagiaire.

Dotnet France Association James RAVAILLE

33

Premiers pas avec ADO .NET Data Services

// C#
private void supprimerToolStripMenuItem_Click(object sender, EventArgs e)
{
// Variables locales.
Stagiaire oStagiaire;
DialogResult oResult;
try
{
// Initialisation.
oStagiaire = this.StagiaireCourant;
if (oStagiaire != null)
{
// Demande de confirmation.
oResult = MessageBox.Show("Etes-vous srs de vouloir
supprimer ce stagiaire ?", "Demande de confirmation",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (oResult == DialogResult.Yes)
{
// Suppression du stagiaire dans la base de donnes.
oStagiaire.Supprimer();
// Suppression du stagiaire dans la grille.
BdsStagiaires.RemoveCurrent();
}
}
}
catch (Exception aEx)
{
MessageBox.Show(aEx.Message);
}
}

Dotnet France Association James RAVAILLE

34

Premiers pas avec ADO .NET Data Services

' VB .NET
Private Sub supprimerToolStripMenuItem_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
supprimerToolStripMenuItem.Click
' Variables locales.
Dim oStagiaire As Stagiaire
Dim oResult As DialogResult
Try
' Initialisation.
oStagiaire = Me.StagiaireCourant
If (oStagiaire IsNot Nothing) Then
' Demande de confirmation.
oResult = MessageBox.Show("Etes-vous srs de vouloir
supprimer ce stagiaire ?", "Demande de confirmation",
MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If (oResult = DialogResult.Yes) Then
' Suppression du stagiaire dans la base de donnes.
ContexteDonnees.DeleteObject(oStagiaire)
ContexteDonnees.SaveChanges()
' Suppression du stagiaire dans la grille.
BdsStagiaires.RemoveCurrent()
End If
End If
Catch aEx As Exception
MessageBox.Show(aEx.Message)
End Try
End Sub

Dotnet France Association James RAVAILLE

35

Premiers pas avec ADO .NET Data Services

5 Excution de lapplication
5.1 Excution des fonctionnalits de lapplication
Avant deffectuer les manipulations prsentes ci-dessous, nous activons les traces HTTP
dans lapplication DotnetFrance_DataServices. Dans le fichier de configuration Web de cette
application Web, dans llment system.web :
' Fichier de configuration
<trace enabled="true" />

Lors de lexcution de lapplication, la fentre de gestion des stagiaires apparat :

5.1.1

Ajout dun stagiaire


En cliquant sur litem Ajouter, la fentre suivante apparat. Nous spcifions un nom et un
prnom, puis nous validons :

Dotnet France Association James RAVAILLE

36

Premiers pas avec ADO .NET Data Services

5.1.2

Modification dun stagiaire


Puis en cliquant sur litem Modifier du menu contextuel sur le stagiaire que nous venons de
crer, nous pouvons modifier son prnom :

Dotnet France Association James RAVAILLE

37

Premiers pas avec ADO .NET Data Services


5.1.3

Suppression dun stagiaire


Puis en cliquant sur litem Supprimer du menu contextuel sur le stagiaire que nous venons de
crer, nous le supprimons.

5.2 Observation des traces HTTP


Aprs ces manipulations, dans un navigateur Web, nous pouvons visualiser les traces HTTP
enregistres via lURL suivante : http://localhost/DotnetFrance_DataServices/Trace.axd. On obtient
le rsultat suivant :

On peut observer que la premire requte HTTP envoye, permet daccder la liste des
stagiaires, contenue dans la base de donnes.
La seconde requte permet dajouter un stagiaire dans la base de donnes.
La troisime permet de persister les modifications effectues sur un stagiaire, dont
lidentifiant est 12.
La dernire permet de supprimer un stagiaire, dont lidentifiant est 12.

Dotnet France Association James RAVAILLE

38

Premiers pas avec ADO .NET Data Services

6 Conclusion
Tout au long de ce cours, nous avons vu comment :
-

Crer un modle de donnes avec Entity Data Model (EDM).


Exposer des donnes au travers de service ADO .NET.

Ce cours constitue une entre en matire sur ADO .NET Data Services. Les prochains cours
publis sur Dotnet-France dtailleront diffrents points simplement prsents dans ce support
(scurit, requtes daccs aux donnes dfinition des droits sur les donnes, ).

Dotnet France Association James RAVAILLE

Vous aimerez peut-être aussi