0% ont trouvé ce document utile (0 vote)
44 vues37 pages

Adonet

Cours Ado net

Transféré par

btsdsi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
44 vues37 pages

Adonet

Cours Ado net

Transféré par

btsdsi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

http://www.labo-dotNET.

com

ADO.NET
SUPINFO DOT NET TRAINING COURSE

Auteur : Fidle Tatefo-Wamba et Aleksandar Lukic


Version 1.2 19 novembre 2004
Nombre de pages : 37

Ecole Suprieure dInformatique de Paris


23. rue Chteau Landon 75010 PARIS
www.supinfo.com
ADO.NET 2 / 37

Table des matires


1. INTRODUCTION ............................................................................................................................................. 3

2. PRESENTATION DE ADO.NET .................................................................................................................... 4

2.1. CONFIGURATION NECESSAIRE POUR LA PLATE-FORME ADO.NET................................................................ 4


2.2. VUE DENSEMBLE DU MODELE ADO.NET.................................................................................................... 4
2.3. LES ESPACES DE NOMS .................................................................................................................................. 5
3. LES COMPOSANT DE ADO.NET ................................................................................................................. 6

3.1. LES FOURNISSEURS MANAGES ....................................................................................................................... 6


3.1.1. Connection ............................................................................................................................................ 6
3.1.1.1. Dans le code.......................................................................................................................................... 6
3.1.1.2. A laide de Visual Studio....................................................................................................................... 7
3.1.2. Command ............................................................................................................................................ 11
3.1.2.1. Dans le code........................................................................................................................................ 11
3.1.2.2. A laide de Visual Studio..................................................................................................................... 14
3.1.3. DataReader ......................................................................................................................................... 15
3.2. TRANSACTIONS ........................................................................................................................................... 17
3.2.1. Exemple de cration dune transaction complte : ............................................................................. 18
3.2.2. Les niveaux disolement ou IsolationLevel.......................................................................................... 18
4. LES PROCEDURES STOCKEES................................................................................................................. 20

4.1. PRESENTATION............................................................................................................................................ 20
4.2. MISE EN UVRE .......................................................................................................................................... 20
4.2.1. Cration partir du LDD (Langage de Dfinition des Donnes)....................................................... 20
4.2.2. Cration partir de Entreprise Manager ........................................................................................... 22
4.2.3. Cration partir de VS.NET DataBase Tools .................................................................................... 22
4.3. IMPLEMENTATION DES PS DANS LE CODE C# .............................................................................................. 24
4.3.1. Cration de la commande et appel de la procdure............................................................................ 24
4.3.2. Passage et rcupration des diffrents paramtres............................................................................. 24
5. DATAADAPTER ............................................................................................................................................ 25

5.1. PROPRIETE TABLES : TABLEAU DE DATATABLE ......................................................................................... 29


5.2. PROPRIETE COLUMNS : TABLEAU DE DATACOLUMN .................................................................................. 29
5.3. PROPRIETE ROWS : TABLEAU DE DATAROW ............................................................................................... 30
5.4. PROPRIETE CONSTRAINTS : TABLEAU DE CONSTRAINT ............................................................................... 30
5.5. PROPRIETE RELATIONS : TABLEAU DE DATARELATION .............................................................................. 30
6. DATABINDING .............................................................................................................................................. 32

6.1. LE DATABINDING DANS LE CODE ................................................................................................................ 32


6.2. LE DATABINDING DANS LE DESIGNER......................................................................................................... 33
6.3. DATAVIEW ................................................................................................................................................. 33
7. MISE A JOUR DES DONNEES .................................................................................................................... 35

7.1. EN UTILISANT COMMAND ........................................................................................................................... 35


7.2. EN UTILISANT DATASET ET DATAADAPTER ............................................................................................... 35
7.2.1. Effectuer les changements................................................................................................................... 35
7.2.2. Transfrer les changements ................................................................................................................ 36
8. DATASET TYPE ............................................................................................................................................ 37

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 3 / 37

1. Introduction
Quelque soit le type dapplication dveloppe, laccs aux donnes est un lment important. Le
Framework .NET possde une technologie nomme ADO.NET (ADO pour Activex DataBase Object),
qui constitue la couche daccs aux bases de donnes. Elle permet ainsi aux applications fonctionnant
sous .NET daccder aux informations stockes dans la plupart des bases de donnes du commerce.

Anciennement appel ADO+, ADO.NET est lvolution directe de ADO. Les modles prsents par
Microsoft furent successivement DAO (Data Access Object), RDO (Remote Data Object) et ADO
(Activex Data Object), qui obligeaient les dveloppeurs apprendre sans cesse utiliser de nouveaux
modes daccs aux donnes en fonction du type de base de donnes utilise. Par ailleurs, ADO
fonctionnait en connexion permanente avec une base de donnes et ne grait pas le XML.

ADO.NET fonctionne sur le principe de fournisseurs manags ou fournisseurs cods et est grer par la
plate-forme .NET. Ainsi tous les objets fournis par ADO.NET sont grs par la CLR sur le principe
commun la compilation (jus-in-time et MSIL), la cration et la suppression dobjets (Garbage
Collector), et lexcution dun programme sous .NET. Ces derniers permettent un accs direct aux
bases de donnes sans quil soit ncessaire de connatre les spcificits de chaque base de donnes et
didentifier les fonctionnalits utilises par une base de donnes par rapport une autre puisquil sagit
dune couche qui uniformise laccs aux donnes ; par exemple, certaines fonctions utilisaient des
paramtres plus ou moins diffrents en fonction de la base de donnes utilise et il tait ncessaire de les
connatre pour pouvoir utiliser le fournisseur de donnes correspondant, ce nest plus le cas avec
ADO.NET.
Il faut noter quADO.NET cohabite avec ADO, ce qui permet de laisser ADO la disposition des
programmeurs travers des services dinteroprabilit COM de .NET. Il est donc tout fait possible
dutiliser ADO pour des applications fonctionnant en mode connect. Nanmoins, des diffrences
profondes existent entre ADO et ADO.NET, notamment en termes de syntaxe, de conception code et de
migration.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 4 / 37

2. Prsentation de ADO.NET
2.1. Configuration ncessaire pour la plate-forme
ADO.NET
ADO.NET est fourni avec le Framework .NET et peut tre utilis sous Windows
CE/95/98/ME/NT4SP6a/2000/XP. Il est par ailleurs ncessaire dinstaller MDAC (Microsoft Data
Access Components version 2.6) ou suprieur pour utiliser les fournisseurs de donnes SQL Server ou
OLE DB.

Avant ADO.NET, il existait ADO ActiveX Data Object. Dans ADO, on manipule des Recordsets qui
font appel aux curseurs ct client ou ct serveur. Ces curseurs sont parcouru ligne par ligne et
permettent daccder aux donnes dans une table (colonnes et lignes). Ses curseurs sont grs par les
dveloppeurs grce notamment la proprit CursorLocation.
De plus il est impossible dutiliser ADO travers les pare-feux. Enfin, laccs aux donnes avec ADO
ncessite une connexion permanente la source de donnes pouvant entraner des problmes de
performances.

2.2. Vue densemble du modle ADO.NET


ADO.NET a t conue avec des optiques un peu diffrentes :
Il doit permettre le fonctionnement en mode dconnect. En effet, un des gros problmes des
applications base de donnes est le goulot dtranglement li aux bases de donnes. Le mode
dconnect permet de charger les donnes en mmoire et libre ensuite la connexion la base
de donnes. Cela est possible dans .NET grce lutilisation de lobjet DataSet. Lobjet
DataSet peut tre utilis indpendamment dun fournisseur de donnes afin de grer des
donnes de lapplication locale ou des donnes XML. Cest un des deux modes de
fonctionnement possible : en effet, le mode de fonctionnement connect est toujours disponible.
Il doit tre entirement indpendant de la base de donnes. En effet, les Recordsets dADO
sont plus ou moins dpendant du SGBD et ncessitaient parfois des connaissances particulires
sur le SGBD. Maintenant, les objets utiliss dans ADO.NET sont entirement indpendants.
Il doit tre introprable avec dautres systmes. Pour cela, ADO.NET a t entirement conu
avec la technologie XML, ce qui lui permet de manipuler des donnes provenant dautre chose
que de bases de donnes, comme par exemple un systme de fichiers, Active Directory, Index
Server, On dit quil uniformise linterface de programmation pour les classes containers de
donnes. Quelques soient le type dapplication (Web ou Windows) et le type de source de
donnes, les donnes seront manipules avec les mmes classes.
ADO utilise les Variants comme type de donnes (un Variant est un type de donnes provenant
de Visual Basic, et permettant de stocker tout type de donnes). Maintenant, ADO.NET utilise
un typage des donnes fort, ce qui permet galement de faire des vrifications directement la
compilation et non plus lexcution comme ctait le cas avec ADO.
ADO utilise la technologie COM en interne, ce qui ralentit considrablement les temps de
traitement (principalement d au marshalling/unmarshalling de paramtres). ADO.NET a t
entirement rcrit en code .NET et est de ce fait beaucoup plus performant.

Pour rpondre toutes ces contraintes, un nouveau modle de classes a t mis en place dans
ADO.NET :

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 5 / 37

Connected layer : Diconnected layer :


Managed Provider Dataset qui cache les donnes
Accs physique la base

Figure 1 - Modle de classe ADO.NET

Ainsi, les objets ADO.NET se divisent en deux catgories : les fournisseurs de donnes manags et
lobjet DataSet + ses collections.

2.3. Les espaces de noms


Les espaces de nom de la plate forme .NET utiliss pour laccs aux donnes sont les suivants :

Espaces de noms Description


System.Data Contient les classes de base de larchitecture ADO.NET permettant de
construire des composants capables dadministrer les informations en
provenance de sources de donnes multiples.
System.Data.Common Contient des classes partages pour les fournisseurs de donnes
manages de .NET. Le fournisseur de donnes de .NET est une
collection de classe qui permet laccs une source de donnes, et donc
de la relier un objet DataSet.
System.Data.SqlTypes Fournit les classes capables de reprsenter des types de donnes en
mode natif de SQL Server. Ces classes mettent la disposition des
programmeurs une mthode scurise permettant de faire rfrence
des types de donnes SQL
System.Data.SqlClient Contient les classes prenant en charge le fournisseur de donnes SQL
Server de .NET. Ces classes permettent laccs aux donnes pour SQL
Server 7.0 et suprieur.
System.Data.OleDb Contient des classes qui prennent en charge le fournisseur de donnes
OLE DB de .NET. Ces classes fournissent un accs manag pour tous
les fournisseurs OLE DB pris en charge notamment les SGBD Oracle,
Jet, et les versions 6.5 et antrieur de SQL Server
Tableau 1 - Espaces de nom pour l'accs aux donnes

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 6 / 37

3. Les composant de ADO.NET


3.1. Les fournisseurs manags
Les fournisseurs manags permettent laccs aux sources de donnes (SQL Server, Oracle, ). Ils
extraient et prsentent les donnes travers des classes .NET tels que DataReader ou DataTable.

Deux fournisseurs manags sont fournis par dfaut :


SQL Server Managed Provider : namespace System.Data.SqlClient et System.Data.SqlTypes,
fonctionne avec SQL Server 7.0 et suprieur. Bien quil soit possible daccder aux donnes des
versions 7.0 ou suprieur de SQL Server via le fournisseur manag OLE DB, il est conseill
dutiliser le fournisseur manag de SQL Server pour des raisons de performances. En effet, ce
dernier utilise le TDS (Tabular Data Stream ou flux de donnes tabulaires ), qui est le
protocole de communication natif de SQL Server.
OLE DB Managed Provider : namespace System.Data.OLEDB, fonctionne avec les OLE DB
Providers.
ODBC Managed Provider : namespace System.Data.Odbc.
Oracle Managed Provider : namespace System.Data.OracleClient.

Un fournisseur manag comprend les classes Command, Connection, DataAdapter, DataReader et


Transaction, et gre les points suivants :
Le paramtrage dune connexion une source de donne via lobjet Connection.
La rcupration du flux de donnes en lecture seule en provenance dune source de donne
laide de lobjet DataReader.
La rcupration dun flux dinformation en provenance de la source de donnes et le transfert
de ces donnes un objet DataSet pour pouvoir visualiser et mettre jour ses informations via
lobjet de type DataAdapter.
La synchronisation des mises jour ralise dans un DataSet par rapport la source de donnes
originelle via lobjet DataAdapter.
La notification des erreurs pouvant survenir pendant la synchronisation des donnes.

3.1.1. Connection

3.1.1.1. Dans le code


Lobjet Connection permet de crer une connexion une source de donnes ou un fournisseur de
donnes. Il reprsente une session unique vers une base de donnes, et est utilis par des objets tels que
lobjet Command pour effectuer certaines oprations. Par dfaut, ADO.NET met la disposition des
dveloppeurs 3 types dobjet Connection :
Lobjet SqlConnection pour laccs aux bases de donnes SQL Server version 7.0 et ultrieur.
Lobjet OdbcConnection pour laccs aux bases de donnes de type ODBC.
Lobjet OleDBConnection pour accder aux bases de donnes de type OLEDB.

Il faut savoir que ses trois objets sont de simple variante de lobjet Connection. En effet, linterface
IDbConnection est implmente par ses trois objets. Elle permet donc aux fournisseurs de donnes de
crer leur propre implmentation de lobjet Connection.

Exemple pour une connexion vers SQL Server en utilisant SqlConnection, le provider fourni pour SQL
Server :

SqlConnection sqlConnection;
sqlConnection = new SqlConnection();

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 7 / 37

sqlConnection.ConnectionString = "data source=localhost;"+


"initial catalog=MyDatabase;integrated security=SSPI";
OleDbConnection oleDbConnection;
oleDbConnection = new OleDbConnection();
oleDbConnection.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;"+
"Password="""";User ID=Admin;"+
"Data Source=D:\temp\test.mdb;Mode=Share Deny None;"+
"Extended Properties="""";Jet OLEDB:System database="""";"+
"Jet OLEDB:Registry Path="""";"+
"Jet OLEDB:Database Password="""";"+
"Jet OLEDB:Engine Type=5;"+
"Jet OLEDB:Database Locking Mode=0;"+
"Jet OLEDB:Global Partial Bulk Ops=2;"+
"Jet OLEDB:Global Bulk Transactions=1;"+
"Jet OLEDB:New Database Password="""";"+
"Jet OLEDB:Create System Database=False;"+
"Jet OLEDB:Encrypt Database=False;"+
"Jet OLEDB:Don't Copy Locale on Compact=False;"+
"Jet OLEDB:Compact Without Replica Repair=False;"+
"Jet OLEDB:SFP=False";

Une autre manire de crer dinstancier un objet Connection, est dutiliser le concepteur visuel
dapplication de Visual Studio .NET.

3.1.1.2. A laide de Visual Studio


Avant de crer la connexion automatiquement dans le code, il faut dabord se connecter la base de
donnes laide de lexplorateur de serveur. Pour cela, dans lexplorateur de serveurs, faire bouton droit
sur le nud "Data connections" et choisir la commande "Add Connection".

Figure 2 - Connexions la base de donnes l'aide de Visual Studio

Dans la boite de dialogue de figure ci-dessous, il est possible dindiquer un serveur SQL Server comme
source de donnes ou de choisir le fournisseur manag de la base de donnes qui sera utilise. Pour
lexemple actuel, il faut choisir le fournisseur .NET OleDb Jet partir de longlet fournisseur pour se
connecter la base de donnes Access.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 8 / 37

Figure 3 - Choix du serveur SQL Server

Figure 4 - Choix du moteur JET

En cliquant sur le bouton suivant, longlet "Connexion" apparat diffremment et propose dindiquer les
informations de connexion la base de donnes Access. Le bouton "Tester" permet de tester la
connexion la base indique dans la boite de texte correspondante.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 9 / 37

Figure 5 - Information sur le nom dutilisateur de la base de donnes

Figure 6 - Test de la connexion

Longlet "Proprits avances" permet de modifier les autorisations daccs la base de donnes et
longlet "Toute" permet de modifier une valeur de la chane de connexion. Aprs avoir cliqu sur le
bouton "Ok", la connexion apparat dans lexplorateur de serveurs.

Figure 7 - La base de donnes dans lexplorateur des serveurs

Une fois la connexion tablit, il est possible de visualiser les tables grce loutil "Visual Data Base
Tools". Maintenant, dans longlet "Data", il faut glisser-dposer un composant OleDbConnection dans
loutil ddition de Visual Studio .NET. Cela pour effet de crer un objet connexion. Il est possible de
modifier ses proprits notamment son nom et sa chane de connexion dans la fentre des proprits.

Figure 8 - Contrle OleDbConnection

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 10 / 37

Figure 9 - Proprits dun objet OleDbConnection

Pour que la connexion puisse seffectuer, il faut renseigner la proprit ConnectionString de lobjet
Connection. La chane de connexion est lensemble des informations ncessaires pour crer une
connexion une source de donne. Remplir la chane de connexion peut se faire directement dans le
code (voir paragraphe 3.1.1.1 oleDbConnection.ConnectionString) ou automatiquement par VS.NET
dans les proprits de lobjet rcemment cre.

Figure 10 - Cration de la chane de connexion

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 11 / 37

Voici quelque unes des autres proprits de lobjet Connection :

Nom de la proprit Description


ConnectionString Voir plus haut
ConnectionTimeOut Proprit en lecture seule indiquant la dure en seconde pendant laquelle la
mthode Open attend pour se terminer avant d'abandonner une tentative et
de gnrer une erreur
Database Proprit en lecture seule retourne une chane de caractre indiquant le nom
de la base de donnes employe une fois la connexion ouverte
Driver Retourne le nom de la DLL utilis pour fournir la connexion ODBC.
(ODBC uniquement)
DataSource Proprit en lecture seule permettant lextraction de la source de donne de
la chane de connexion telle quelle est dfinie.
Provider Retourne le fournisseur de donne OLEDB.
(OLEDB uniquement)
ServerVersion Retourne une chane de caractres contenant les informations sur le serveur
de base de donnes qui fait lobjet de la connexion
State Indique ltat courant de la connexion. Les valeurs possibles pour la
proprit State sont les suivantes : Closed (base de donne ferme, tat par
dfaut de lobjet Connection nouvellement cr) ;
Connecting (lorsque Open est appele et avant quelle ne se termine) ;
Open (lorsque Open sest termin avec succs) ;
Executing (Commande en cours dexcution), Fetching (donnes en cours
dextraction) ;
Broken (Objet abandonn).
Tableau 2 - Proprits de l'objet Connection

Une fois que lobjet Connection est cr et que la chane de connexion est indique, il faut ouvrir une
connexion la base de donnes pour pouvoir y effectuer les manipulations qui nous intresse. Pour cela,
il faut utiliser la mthode Open de lobjet Connexion. La mthode Close permet quand elle de fermer
une connexion pralablement ouverte. Il peut tre intressant de tester que la connexion est ouverte
avant dessayer de louvrir pour viter toute erreur dans lapplication.

connection.Open();
. . . . . . .
connection.Close();

Une meilleure mthode consiste utiliser les clauses try finaly :

Try
{
connection.Open();
. . . . . . .
}
finally
{
connection.Close();
}

3.1.2. Command

3.1.2.1. Dans le code


Aprs que la connexion la source de donne a t tablie, lobjet Command va permettre dexcuter
des commandes sur une base de donnes. Chaque fournisseur de donne de .NET possde sa propre

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 12 / 37

version de lobjet Command. Ainsi, le fournisseur manag SQL Server possde lobjet SqlCommand,
alors que le fournisseur manag OLE DB inclut lobjet OleDbCommand.

Lobjet Command peut aussi bien excuter des requtes, des procdures stockes ou des instructions
Transact-SQL sur une source de donnes. Il va rfrencer dynamiquement lobjet Connection lors de sa
cration bien quils soient tous les deux autonomes. Par ailleurs, il est possible de crer lobjet
Command en utilisant la mthode CreateCommand de lobjet Connection.

Le rsultat des donnes retourn par lobjet Command est stock dans lobjet DataReader. Cela ne
signifie pas quun objet Command doit absolument retourner des informations.

En plus des objets OleDbCommand et SQLCommand, .NET possde une interface gnrique
IDbCommand, qui est implmente par les classes OleDbCommand, SQLCommand et
OdbcCommand.

Constructeurs
Les objets SQLCommand et OleDbCommand possdent un constructeur surcharg permettant de crer
une instance des classes correspondantes

public SqlCommand();
public SqlCommand( string cmdText);
public SqlCommand( string cmdText, SqlConnection Connection);
public SqlCommand( string cmdText, SqlConnection Connection, SqlTransaction,
Transaction);

public OleDbCommand();
public OleDbCommand( string cmdText);
public OleDbCommand( string cmdText, OldbConnection Connection);
public OleDbCommand( string cmdText, OldbConnection Connection,
OleDbTransaction Transaction);

Voici une description des arguments pouvant tre fournis au constructeur :

Arguments Description
cdmText Instruction SQL, nom de procdure stocke (SQL Server), instruction Transact-
SQL (SQL Server). Par dfaut, il sagit dune chane vide.
connection Objet Connection rfrencer pour utiliser lobjet Command. Indiquer lobjet
Connection correspondant au fournisseur de donne manag.
transaction Objet transaction. Il obit la mme rgle que lobjet Connection
Tableau 3 - Argument du constructeur

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 13 / 37

Quelques proprits utiles :

Nom Description
CommandText Instruction SQL, Transact SQL ou nom de procdure stocke (si la proprit
CommandType est place StoredProcedure).
CommandType Dfinie ou rcupre un flag pour indiquer lobjet Command comment est
interprte la valeur contenue dans la proprit CommandText. Les valeurs de
cette proprit sont les suivantes :
Text : (par dfaut) Indique lobjet dinterprter une instruction de Transact-
SQL ;
StoredProcedure : Indique que la valeur de commandText est une procdure
stocke ;
TableDirect : Non pris en charge par le fournisseur de manag SQL Server de
.NET.
CcommandTimeOut Dfinie ou rcupre le dlai dattente de lexcution dune commande avent
que celle-ci ne soit abandonne et quune erreur est renvoye.
Transaction Indique ou rcupre un objet transaction pour une commande
UpdateRowSource Indique de quelle manire utiliser les rsultats dune commande pour modifier
un DataRow dans un DataSet losrque la mthode Update est appele sur
SqlDataAdapter. Elle est galement requise par lInterface IDbCommand.
designTimeVisible Indique si la proprit DesignTimeVisible est visible dans le control de
conception graphique de Visual Studio .NET.
Tableau 4 - Proprits de l'objet command

Quelques mthodes utiles :

Nom de la mthode Description


ExecuteReader Excute la commande contenue dans la proprit CommandText sur la
connexion assigne et renvoie un objet SqlDataReader ou
OleDbDataReader. Il est possible de contrler le comportement de lobjet
DataReader utilis en fournissant un flag CommandBehavior.
ExecuteNonQuery Excute une requte SQL sur une connexion et retourne le nombre de ligne
affect sous forme dentier.
Tableau 5 - Mthodes de l'objet command

Exemple dutilisation dun ordre Update:

OleDbConnection connection;
OleDbCommand command;
int rowAffected;

connection = new OleDbConnection("...");


command = new OleDbCommand("UPDATE MyTable " +
"SET MyField = 'MyValue'", connection);
connection.Open();
try
{
rowAffected = command.ExecuteNonQuery();
}
finally
{
connection.Close();
}

On peut spcifier des paramtres dans la commande, avec un @ devant les paramtres. On utilise
ensuite la proprit Parameters de lobjet Command pour remplir les paramtres.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 14 / 37

command = new OleDbCommand("UPDATE MyTable " +


"SET MyField = @MyParam", connection);
command.Parameters["MyParam"].Value = "MyFieldValue";

3.1.2.2. A laide de Visual Studio


On procde de la mme manire que pour lobjet Connection. On glisse et dpose un contrle
OleDbCommand ou SQLCommand. Puis on modifie ensuite la proprit Connection dans la fentre
des proprits.

Figure 11 - Choix de l'objet Connection

On peut directement y indiquer la requte SQL utiliser en choisissant la proprit correspondante


(cliquer sur le petit bouton 3 points). Cela a pour effet douvrir le constructeur de requte sur la base
de donnes utilise par notre objet Connexion renseign plus tt. Il ne reste plus qu aller dans le code
pour ajouter les mthodes Open et Close et excuter notre commande.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 15 / 37

Figure 12 - Constructeur de requtes

Modifier lenregistrement "CategoryName" de la table "Categories" pour y ajouter les donnes passes
dans une boite de texte aprs ouverture de la base de donnes. Il faut quun label indique que celle-ci est
ouverte.

Une fois la commande cre, la mthode Open va permettre douvrir la connexion cre auparavant.
Elle est appele partir de lobjet connection.

connection.Open();

Il faut veiller fermer la connexion la base de donnes. Pour le faire, il faut utiliser la mthode Close
de lobjet Connection.

connection.Close();

3.1.3. DataReader
Sous .NET, il existe 2 mcanismes daccs aux donnes dun entrept de donnes : le DataReader et le
DataAdapter.
Le DataReader met directement la disposition des utilisateurs un flux de donnes rapide, en lecture
seul, en avant seulement, ce qui amliore la rapidit de traitement. Il est par contre limit. Voici
quelques une de ses caractristiques :
Laccs la base de donnes se fait par enregistrement. Il ne peut exister quun seul
enregistrement la fois dans lobjet DataReader.
Il est impossible deffectuer des oprations complexes sur les enregistrements tels que des tris
ou des accs directs.
Lobjet DataReader fonctionne en mode connect. Aucunes autres actions ne peuvent tre
effectues sur la connexion lors de laccs la source de donnes. Il ne faut donc pas oublier de
fermer le DataReader aprs son utilisation pour librer la connexion la base de donnes.

Tout comme les objets Connection et Command, il existe aussi une dclinaison diffrente de lobjet
DataReader pour chaque fournisseur de donnes de la plate-forme .NET :

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 16 / 37

SqlDataReader pour SQL Server 7.0 et suprieur dfini dans lespace de nom
System.Data.SqlClient.
OleDbDataReader pour les sources de donnes OLE DB dfini dans lespace de nom
System.Data.OleDb.
OdbcDataReader pour les sources de donnes ODBC dfini dans lespace de nom
System.Data.Odbc.

Il nexiste pas de constructeur pour lobjet DataReader. Linstanciation dun objet DataReader se fait
en utilisant la valeur retourne par lexcution de la mthode ExecuteReader de lobjet Command.

OleDbCommand command;
command.Connection = oleDbConn;
command.CommandText = SELECT * FROM TABLE;
OleDbDataReader reader =
Command.ExecuteReader(CommandBehavior.ConnectionClose);

Voici quelques proprits de lobjet DataReader :

Nom de la proprit Description


Depth En lecture seule, elle retourne un entier indiquant le degr dencapsulation de
la ligne courante dans une requte de modlisation de donne.
FieldCount Retourne le nombre de colonnes prsentes dans lenregistrement courant
rcupr par lobjet DataReader.
IsClosed Indique si lobjet DataReader est ferm
Item Rcupre la valeur de la colonne de donnes spcifique comme objet .NET. Il
existe 2 implmentations surcharges de cette proprit : une pour le nom de la
colonne et lautre pour la position ordinale de la colonne.
RecordsAffected Indique le nombre de lignes modifis, ajoutes ou supprimes par lexcution
dune instruction SQL.
Tableau 6 - Proprits du DataReader

Quelques mthodes :

Mthode Description
Close Dfinie par linterface IDataReader, elle permet de fermer le DataReader afin de
librer la connexion la base de donnes
Read Elle permet la lecture des enregistrements de la table. Elle va dplacer le pointeur de
lobjet DataReader vers lenregistrement suivant et ensuite va lire les informations de
la ligne courante. Elle renvoie False sil ny a pas denregistrement suivant lire,
sinon elle renvoie True
Tableau 7 - Mthodes DataReader

Exemple de lecture :

OleDbConnection connection;
OleDbCommand command;
OleDbDataReader reader;

connection = new OleDbConnection("...");


command = new OleDbCommand("SELECT * FROM Employee",
connection);
connection.Open();
try
{
reader = command.ExecuteReader();

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 17 / 37

try
{
while (reader.Read())
listBox.Items.Add(reader["FieldName"]);
}
finally
{
reader.Close();
}
}
finally
{
connection.Close();
}

3.2. Transactions
Une transaction est une opration unique garantissant latomicit de squences dopration portant sur
une base de donnes. On peut imaginer une opration de transfert de fond dans laquelle le dbit effectu
sur un compte source et le crdit vers sur un comte cible doivent se succder parfaitement. Si lune au
lautre de ses actions choue, lopration tout entire est annule. Ainsi soit tout est excut, soit tout est
annul. On parle alors datomicit du code. Une transaction bien conue suit les recommandations
ACID : Atomicity, Consistency, Isolation, Durability pour atomicit, cohrence, isolement et durabilit.

Atomicit : Une transaction russit totalement dans sa tche ou alors choue (ne rien faire du tout).
Cohrence : Les donnes dans une transaction sont dans un tat connu quand elle commence et
continues ltre lorsquelle se termine.
Isolement : Une transaction ne doit pas voir les modifications apportes sur les donnes par une autre
transaction, elle ne soccupe que delle-mme, on dit quelle est dans un canal.
Durabilit : En cas de russite de la transaction, le systme garantis que les donnes valides sont
envoyes vers la source de donnes. Un journal de transaction peut enregistrer des informations de
suivit des actions effectuer.

Comme pour les objets tudis plus haut, il existe 3 classes Transactions sous ADO.NET :
OleDbTransaction, SqlTransaction et OdbcTransaction respectivement pour les transactions OLEDB,
SQL Server et ODBC.

Linstanciation dun objet Transaction se fait en appelant la mthode BeginTransaction de lobjet


Connection. Il est possible dutiliser lobjet Command pour oprer sur les donnes. Pour cela, il faut
assigner lobjet Transaction lobjet Command laide de sa proprit Transaction.

myTransaction = MyConnect.BeginTransaction();
mYCommand.Transaction = MyTransaction;

Quelques mthodes :

Mthode Description
BeginTransaction Cre une transaction imbrique et retourne une rfrence sur le nouvel objet
OleDbTransactionn ou SqlTransaction.
Commit Valide les modifications en attente ralises sur la base de donnes
lintrieur de la transaction courante
Rollback Annule les modifications en attente effectues sur la base de donnes
lintrieur de la Transaction courante. Elle permet aussi dannuler les
modifications en attente sur la base de donnes courante depuis le dernier
point de sauvegarde.
Tableau 8 - Mthodes de l'objet Transaction

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 18 / 37

Remarque : Il est possible avec des sources de donnes SQL Server de crer des points de sauvegarde
dans la transaction courante laide de la mthode Save.

3.2.1. Exemple de cration dune transaction complte :


OleDbConnection oleDbConnection;
OleDbTransaction oleDbTransaction;

oleDbConnection.ConnectionString = "...";
oleDbConnection.Open();
try
{
oleDbTransaction = oleDbConnection.BeginTransaction();
try
{
// Traitement, requtes SQL, ...

oleDbTransaction.Commit();
}
catch (Exception ex)
{
oleDbTransaction.Rollback();
throw();
}
}
finally
{
oleDbConnection.Close();
}

Par contre, il faut spcifier que tous les composants que vous utilisez pour accder votre base de
donnes, utilisent cette transaction. Ceci se fait de la manire suivante :

myCommand.Transaction = oleDbTransaction;

Ainsi, quelque que soit la requte SQL contenue dans myCommand, elle sexcutera au sein de la
transaction.

3.2.2. Les niveaux disolement ou IsolationLevel


Il permet dindiquer comment les transactions vont interagir entre elles. Les niveaux disolement
dfinissent des mcanismes de verrouillage qui permettent dviter des situations tels que la lecture des
donnes qui ayant t modifis par une autre transaction nont pas t valids ou lextraction de
diffrents rsultats de donnes lorsque des informations sont relues aprs une modification des donnes.
Les niveaux disolement utilisent un mcanisme de verrou pour protger laccs aux informations dans
une source de donnes.

Les niveaux disolement sont :


Chaos : Aucun accs en criture nest autoris sur les modifications en attente depuis une
transaction avec un niveau disolement plus lev.
Unspecified : Le fournisseur utilise un niveau disolement qui ne peut pas tre modifi.
Readuncommitted : Toutes les informations peuvent tre lues. Aucun verrou nest plac sur les
donnes. Avec ce niveau, il peut apparatre des lectures incorrectes, des lectures non rptitives,
des lectures des lignes fantmesetc.
ReadCommited : Les lectures au cours de lexcution dune transaction nincluent pas les
modifications en attente de validation. Les lectures de donnes modifies et non valides par
une transaction ne sont pas exclues, mais pas les lignes fantmes et les lectures non rptitives.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 19 / 37

ReapeatableRead : Les autres processus nont pas daccs en criture sur les donnes pendant
lexcution dune transaction, mais les insertions dans les tables sont autorises. Les lectures
incorrectes et les lectures non rptitives sont exclues, mais pas les lignes fantmes.
Serializable : les autres processus nont pas daccs en lecture, nie en criture au cours de
lexcution de la transaction, et les insertions dans la table ne sont pas autorises. Les lectures
incorrectes, les lectures non rptitives et les lignes fantmes sont exclues ;

Exemple :

myTransaction = myConnexion.BeginTransaction(IsolationLevel.ReapeatableRead)

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 20 / 37

4. Les procdures stockes


4.1. Prsentation
Une procdure stocke est un ensemble dinstructions SQL pouvant sexcuter de manire atomique.
Ceux sont des objets constitus de vritables programmes pouvant recevoir des paramtres, renvoyer
des valeurs, tre excuts distance, possder leurs propres droits daccs.
Les procdures stockes possdent les avantages suivants :

Elles amliorent les performances des applications : en effet, les procdures stockes sont
conserves dans la base de donnes sous forme dexcutables. La structure modulaire permet de
concevoir de petites units programmatiques indpendantes qui seront plus rapides charger en
mmoire et partant excuter dans une base de donnes. De plus, elles sont stockes dans le
cache mmoire du serveur sous forme compile lors de leur premire excution (il sagit du
plan dexcution des procdures stockes), ce qui accrot les performances notamment pour les
excutions suivantes.
Elles permettent de sparer le code source de lapplication du code SQL : lintrt est de
faciliter la localisation et la modification des requtes SQL en cas de modification ou de
changement de la base de donnes. On peut imaginer quil faille changer de base de donnes en
cours de dveloppement informatique, il ne sera alors pas ncessaire de parcourir tout les code
source des diffrents modules de lapplication pour retrouver les requtes SQL afin de les
modifier, il faudra juste modifier les procdures stockes correspondantes. De mme, un autre
dveloppeur pourra facilement localiser les requtes SQL dune application sur laquelle il na
pas travaill auparavant.

De nombreuses procdures stockes sont fournis par Microsoft avec SQL Server et sont cres lors de
linstallation du server.

Voici les diffrents cas dutilisation des procdures stockes :


Enchanement dinstructions
Accroissement des performances
Scurit dexcution
Manipulation des donnes systme du serveur de base de donnes
Mise en uvre des rgles dentreprise (pour SQL Server notamment)
Traitements en cascade

4.2. Mise en uvre


Les procdures stockes acceptent comme beaucoup de langages des paramtres entres et des
paramtres en sorties. Une procdure stocke est capable dappeler dautres procdures stockes ou
fonctions comme dtre appeles par dautres programmes.
La cration dune procdure stocke peut se faire de trois faons : partir du langage de dfinition des
donnes, partir de la MMC (Microsoft Management Console) dEnterprise Manager ou partir de
Visual Studio .NET.

Remarque : La taille maximum dune procdure stocke est de 128 MB.

4.2.1. Cration partir du LDD (Langage de Dfinition des Donnes)


Voici la syntaxe utiliser pour crer une procdure stocke :

CREATE PROC[EDURE] procedure_name [; number]


[{@ parameter data_type}

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 21 / 37

[VARYING][=default_value] [OUTPUT]
][,.n]

[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}]

[FOR REPLICATION]

AS sql_statement [n]
GO

Voici une description des arguments utiliss dans cette commande:

Arguments Description
procedure_name Nom de la procdure, il doit tre unique dans la base de
donnes et se conformer aux rgles des identificateurs.
Prcd dun #, la procdure sera temporaire locale, de deux
#, elle sera temporaire globale.
number Cest une valeur entire optionnelle indiquant le numro
dordre pour les procdures ayant le mme nom.
parameter Reprsente un paramtre dans la procdure. Un ou plusieurs
paramtres peuvent tres dclars dans une procdure. La
valeur dun paramtre dclar doit tre renseigne par
lutilisateur qui se servira de la procdure stocke. Une
procdure stocke ne peut contenir plus de 2100 paramtres.
Le caractre @ indique quil sagit dun paramtre.
data_type Il sagit du type de donne du paramtre dclar. Tous les
types de donnes peuvent tre utiliss lexception du type
table. Lutilisation du type de donne cursor ne peut tre
utilis que sur des paramtres OUTPUT et ncessite
lutilisation des mots cls VARYING et OUTPUT.
Default_value Variable par dfaut du paramtre dclar.
OUTPUT Indique sil sagit dun paramtre retourn par la procdure
stocke.
n Indique le maximum des 2100 paramtres pouvant tre
spcifis
{RECOMPILE | ENCRYPTION | RECOMPILE : indique que la procdure sera recompile
RECOMPILE,ENCRYPTION } lexcution sans utiliser le cache pour le plan dexcution de
la procdure. Gnralement utilis pour les variables
temporaires.
ENCRYPTION : Indique le cryptage de lentre de la table
syscomments contenant le texte de linstruction CREATE
PROCEDURE. Il permet dviter la publication de la
procdure dans le cadre de la rplication SQL Server.
FOR REPLICATION Indique que la procdure stocke doit tre excute lors de la
modification de la table concerne par un processus de
rplication. Ainsi, la procdure stocke sera utilise comme
filtre de procdure et ne sexcutera que lors de la rplication.
Cette option ne peut pas sutiliser avec loption
RECOMPILE.
AS Indique les actions entreprises par la procdure
Sql_statement Nombre et type de requte de Transact-SQL qui peuvent tre
utiliss dans la procdure
n Indique le nombre maximum de Transact-SQL qui peuvent
tres incluent dans la procdure.
GO Signale la fin dun jeu dinstruction

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 22 / 37

Exemple de code de cration dune procdure stocke :

CREATE PROCEDURE GetUsersByID


@UserID int, --This is the input parameter
@UserName varchar(50) OUTPUT --This is the output parameter

AS
-- Get the User name by ID
Select @UserName = Name
From Users -- The table name
WHERE UserID = @UserID

RETURN
GO

On peut constater que le paramtre @UserName reoit la le nom de lutilisateur dont lID (@UserID)
sera indiqu comme paramtre la procdure stocke GetUserById. Le paramtre @UserName sera
par ailleurs renvoy par la procdure stocke.

4.2.2. Cration partir de Entreprise Manager


Pour cela, partir de loutil Entreprise Manager dans le dossier Microsoft SQL Server des
programmes du menu dmarrer, il faut drouler le dossier Bases de donnes, puis drouler la base de
donnes concerne par la manipulation, faire bouton droit sur le nud Procdures stockes (Stored
procedure) et choisir la commande Nouvelle Procdure stocke comme illustre ci-dessous.

Figure 13 - Cration d'un procdure stocke dans Enterprise Manager

4.2.3. Cration partir de VS.NET DataBase Tools


Il faut pour cela quune connexion la base de donnes ait t effectue partir de lexplorateur de
serveur. Si cette condition est vrifie, il faut juste drouler le nud correspondant la base de donnes
qui possdera les procdures stockes, slectionner le nud "Stored Procedures". Cliquer avec le
bouton droit de la souris sur ce nud et choisir la commande "New Stored Procedure" comme illustr
ci-dessous.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 23 / 37

Figure 14 - Cration d'une procdure stocke dans Visual Studio

VS.NET cre alors un onglet ddition supplmentaire dans sa fentre principale destin lcriture du
code de la procdure stocke nouvellement cre.

Figure 15 - Cration de procdure stocke dans Visual Studio

Une fois la commande enregistre lance, on peut constater que Visual Studio.NET modifie le code de
la procdure stocke.

Figure 16 - Modification de procdure stocke dans Visual Studio

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 24 / 37

4.3. Implmentation des PS dans le code C#


4.3.1. Cration de la commande et appel de la procdure
Une fois une procdure stocke cre sur le serveur de base de donnes, il est facile dappeler celle-ci
dans le code C#. Il faut avant tout sassurer de disposer dun objet de la classe Command (objets
SqlCommand ou OleDbCommand). Pour pouvoir utiliser une procdure stocke, il faut indiquer le nom
de la procdure stocke comme paramtre du constructeur de lobjet et indiquer la proprit
CommandType de cet objet quil sagit dune procdure stocke (utiliser la valeur de lnumration
CommandType).

Exemple :

SqlCommand com= new SqlCommand("GetUsers");


com.CommandType = CommandType.StoredProcedure

Dans lexemple ci-dessus, le nom de la procdure stocke est GetUsers.


Il est aussi possible de procder de la sorte :

SqlCommand com = new SqlCommand();


com.CommandType = CommandType.StoredProcedure
com.CommandText="GetUsers"

4.3.2. Passage et rcupration des diffrents paramtres


Pour passer des paramtres la procdure stocke, il faut crer un objet de la classe SqlParameter en
indiquant comme argument du constructeur, le paramtre cr dans la procdure stocke et le type de ce
paramtre, en second argument. La proprit Value de lobjet de type SqlParameter va indiquer le
champ concern par le paramtre renseign plus haut. La mthode Add permet dajouter lobjet cr
la collection des paramtres (SqlParameterCollection) de la commande.

Exemple de passage de paramtres:

SqlParameter parUserID= new SqlParameter(@UserID,SqlDbType.Int);


parUserID.Value = userID;
com.SelectCommand.Parameters.Add(parUserID);

La rcupration des informations passes par le paramtre de sortie se fait exactement comme sil
sagissait dune requte SQL de slection laide dun DataReader ou dun DataSet.

Exemple de rcupration de paramtres avec un DataSet :

DataSet myDS = new DataSet();

SqlParameter parUserID= new SqlParameter(@UserID,SqlDbType.Int);


parUserID.Value = userID;
com.SelectCommand.Parameters.Add(parUserID);
try
{
com.Fill(myDS);
}
finally
{
myConnection.Close();
}

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 25 / 37

5. DataAdapter
Avant de commencer claircissons un point de syntaxe. Dans ce cours il sera question de DataAdapter,
alors que les composants que vous manipulez sappelleront SqlDataAdapter ou OleDbDataAdapter.
Ces deux composants sont identiques, mais comme vous laurez srement compris, un est optimis pour
une connexion OleDb (Access par exemple) et lautre pour une connexion SQL (SQL Server par
exemple). Nous pouvons prsent continuer.

Le DataAdapter contient en fait un ensemble de mthode permettant laccs la base de donnes. On y


trouve quatre instances de la classe Command :
SelectCommand : permet de slectionner des donnes dans la base
InsertCommand : permet dinsrer des donnes dans la base
UpdateCommand : permet de mettre jour des donnes dans la base
DeleteCommand : permet de supprimer des donnes dans la base

Il y a plusieurs constructeur, cependant le plus utilis prend en premier paramtre une chane de
caractre qui reprsente une requte SQL et qui initialisera la command SelectCommand. Le second
paramtre est une instance de la classe Connection.

Voici un exemple dinitialisation :

string query = "SELECT * FROM MA_TABLE";


OleDbDataAdapter MyDataAdapter = new OleDbDataAdapter( query ,
oleDbConnection);

On suppose bien sur que la connexion OleDbConnection a t initialise.

Voici le fonctionnement :

Dans la partie Data de la ToolBox se trouve les composants DataAdapter. Double cliquez sur lun
deux. Un assistant va safficher :

Figure 17 - Assistant de cration de DataAdapter

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 26 / 37

Cliquez sur "Next" pour arriver sur une fentre vous permettant de spcifier la connexion utiliser.
Vous pouvez en crer une ou en utiliser une dj cr :

Figure 18 - Choix de la connexion

Cliquez sur "Next" pour afficher la fentre permettant de spcifier le type de requtes crer. Suivant le
type de base laquelle vous vous connectez, vous aurez plus ou moins de choix possible. Dans notre
cas, nous utilisons une connexion une base Access, nous ne pouvons donc pas crer de procdure
stocke :

Figure 19 - Choix du type de requte

La fentre qui suit vous permet de spcifier les tables et champs utiliser, soit en crant vous-mme la
requte soit en passant par le Query Builder.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 27 / 37

Figure 20 - Utilisation Query Builder

La dernire fentre vous indique ce que lassistant russi ou pas gnrer. Cependant vous devez
savoir que lassistant ces limites. En effet, si vos tables ne contiennent pas de cl primaire, il ne pourra
gnrer que la requte SELECT. De la mme faon, si vous avez choisis des donnes de plusieurs
tables, il ne pourra gnrer aucune requte.

Figure 21 - Fin de configuration du DataAdapter

Vous avez donc crez un DataAdapter avec le designer. Mais les avantages de cette mthode ne
sarrtent pas l. Dans la fentre proprits, vous pouvez trouver tout en bas quelques liens trs
intressant :

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 28 / 37

Figure 22 - Liens intressant de la fentre Proprit du DataAdapter

"Configure Data Adapter " : relance lassistant pour modifier le DataAdapter dj cr


"Generate DataSet" : va automatiquement gnrer un DataSet Typ (voir paragraphe 8)

Figure 23 - Gnration du DataSet

"Preview Data" : prvisualisation des donnes obtenues grce au DataAdapter

Figure 24 - Prvisualisation des donnes

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 29 / 37

Deux autres mthodes trs intressantes peuvent tre cites. Il sagit de Fill qui permet de remplir un
DataTable ou de crer un DataTable dans un DataSet suivant le paramtre fourni. La deuxime
mthode est Update, qui permet de mettre jour la base de donnes automatiquement. Le
fonctionnement de cette mthode sera dtaill un peu plus loin dans ce cours.
Le DataSet est une reprsentation en mmoire de donnes. Lorsquil contient des donnes provenant
dune base de donnes, il permet de travailler en mode dconnect. Dans ce cas, on a souvent besoin des
donnes de la table que lon veut traiter, mais galement des donnes provenant dautres tables de la
base de donnes lorsquelles sont lies par des contraintes.
Le DataSet doit donc fournir des informations complmentaires quant la structure du modle de
donnes, comme par exemple les relations entre les tables, les cls primaires, les types des colonnes
Ces informations nous permettront de pouvoir travailler efficacement sur des donnes, et ce en mode
dconnect.

DataTable
Rows ChildRelations
DataSet
Collection Collection
ChildRelations
Collection DataRow Relation

Relation Columns ParentRelations


Collection Collection
Tables
Collection DataColumn Relation

DataTable Constraints
Collection
DefaultView
Constraint

Figure 25 - Informations contenues dans un DataSet

Le DataSet est indpendant du modle des donnes et indpendant de la source de donnes. Cest
pourquoi on peut y stocker des donnes provenant de nimporte quelles bases de donnes (SQL Server,
Oracle, Access, ), dun fichier XML sur disque.
On peut tout fait crer un DataSet de toute pice, spcifier des tables, des champs, des contraintes et
utiliser ensuite ce DataSet.

5.1. Proprit Tables : tableau de DataTable


La proprit Tables permet dobtenir une collection de DataTable. Un DataSet contient une ou
plusieurs DataTable (comme vous pouvez le voir sur le schma ci-dessus).
Une DataTable est donc une reprsentation en mmoire de donnes. Comme vous avez pus le voir dans
la partie sur les DataAdapter, ces donnes peuvent tre charges par la mthode Fill.
Cependant vous pouvez galement crer une DataTable de toutes pices en crant les lignes et les
colonnes et en insrant les donnes vous-mme.

5.2. Proprit Columns : tableau de DataColumn


La proprit Columns dune DataTable permet dobtenir une collection de DataColumn. Ce qui
implique bien entendu quune DataTable peut avoir plusieurs DataColumn.
DataColumn contient des informations sur le type du champ. En voici quelques unes :
AllowDbNull : indique si les donnes contenues dans la colonne peuvent avoir la valeur null.
AutoIncrement : indique si la colonne doit incrmenter automatiquement la valeur de la
colonne lors de linsertion dune nouvelle ligne.
Caption : permet de donner ou dobtenir le nom de la colonne.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 30 / 37

DataType : permet de dobtenir ou de dfinir le type des donnes de la colonne.


DefaultValue : obtient ou dfini la valeur par dfaut de la colonne.

Comme vous pouvez le remarquer, on peut facilement faire une correspondance entre les DataTable et
les tables des bases de donnes.

5.3. Proprit Rows : tableau de DataRow


La proprit Rows permet dobtenir une collection de DataRow. Une DataRow reprsente une ligne
dune DataTable. Elle permet daccder aux valeurs dune DataTable en spcifiant un nom de colonne
ou un numro de colonne.

Vous en connaissez assez maintenant pour pouvoir accder des donnes contenues dans une
DataTable. Voyons donc un exemple :

DataTable dtbEmployee;

dtbEmployee = dataSet.Tables["EMPLOYEE"];
foreach (DataRow row in dtbEmployee.Rows)
listBox.Items.Add(row["EMP_NAME"].ToString());

Dans cet exemple, on va chercher chaque ligne de la table "EMPLOYEE" contenue dans le DataSet
dataset. On ajoute ensuite le contenu de la colonne "EMP_NAME" dans une ListBox listBox.

Remarque : Comme vous pouvez le voir dans lexemple ci-dessus, pour accder la valeur dune
colonne on utilise le nom du champ. On aurait pu utiliser lindex de la colonne mais il est trs important
de prfrer la premire technique la seconde. En effet, si le nombre de colonne de la table est amen
changer, il faudra alors revoir tout le code qui utilise cette table.

5.4. Proprit Constraints : tableau de Constraint


La proprit Constraints permet dobtenir une collection de Constraint. Pour rappel, les contraintes
permettent de maintenir lintgrit dune base de donnes.

Les DataTable supportent 2 types de contraintes :


Unique Key Constraints (ou cl primaire) avec la class UniqueKeyConstraint qui permet de
vrifier que les valeurs dune table sont uniques. Si la proprit EnforceConstraints du DataSet
est True, la violation dune contrainte va gnrer une exception.
Foreign Key Constraints (ou cl trangre) avec la class ForeignKeyConstraint qui permet de
spcifier comment agir lorsque une donne dpendante de deux ou plusieurs tables diffrentes
est supprimes. Faut-il la supprimer dans les autres tables, la mettre null ou mettre une valeur
par dfaut ?

Les contraintes permettent la validation des donnes sans ncessit de contacter la base de donnes afin
de maintenir une dconnexion totale avec la base de donnes.

Ces deux relations sont cres automatiquement lors de la cration dun objet DataRelation, mais
peuvent tre cres sparment.

5.5. Proprit Relations : tableau de DataRelation


La proprit Relations de la class DataSet permet dobtenir une collection de DataRelation ou
DataRelationCollection.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 31 / 37

Une DataRelation permet de lier deux tables du DataSet au travers des colonnes ou DataColumn de
celles-ci. Ces relations permettent de reprsenter les relations liant les cls trangres et les cls
primaires.
On retrouve comme dhabitude des notions de base de donnes toujours pour rester le plus proche de
ces dernires et ainsi avoir une reprsentation identique en mmoire lors du fonctionnement en mode
dconnect.

Voici une fonction qui cre une relation entre la colonne "ProductID" des tables "ProductDetails" et
"Products" :

private void CreateRelations()


{
DataColumn parentColumn;
DataColumn childColumn;
parentColumn = DS.Tables["Products"].Columns["ProductID"];
childColumn = DS.Tables["ProductDetails"].Columns["ProductID"];
DataRelation relCustOrder;
relCustOrder = new DataRelation("ProductIDRelation", parentColumn,
childColumn);
DS.Relations.Add(relCustOrder);
}

Comme vous pouvez le voir, le code est trs dtaill. On cre tout dabord deux colonnes qui
correspondent celles que lont veut lier. On cre ensuite une DataRelation qui aura pour nom
"ProductIDRelation". Et finalement, on ajoute cette relation au DataSet.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 32 / 37

6. DataBinding
Le DataBinding consiste prendre les donnes dune source que lon appelle gnralement
provider (DataTable, DataView, ArrayList) et de les placer, par un simple appel de mthode,
dans un contrle qui est appel consumer (DataGrid, DataList, DropDownList).
La relation entre Provider et Consumer est appele Binding.

6.1. Le DataBinding dans le code


Les composants visuels de .NET possdant une proprit DataSource peuvent se connecter un
DataSet, DataTable ou DataView pour afficher des donnes.
Voyons dans un exemple comment faire avec une DataGrid sachant que avec les autre contrle la
technique est exactement la mme :

DataGrid1.DataSource = dataSet;
DataGrid1.DataSource = dataSet.Tables["EMLOYEE"];

On voit donc ici que lon peut connecter la DataGrid directement un DataSet ou bien une table de ce
DataSet.

Attention : En ce qui concerne certains contrles, comme un ComboBox ou une ListBox, lopration se
rvle un peu plus difficile. En effet, tant donn que ces contrles possdent un nombre limit de
colonnes, il vous faudra passer par une tape intermdiaire qui consiste construire un ArrayList
contenant les lments que vous souhaitez mettre dans la ComboBox et seulement aprs procder au
Binding.

Voici un exemple de code :

ArrayList arList = new ArrayList();


string Query = "Select LastName, FirstName from Employees";
DataTable dtEmp = new DataTable();
OleDbDataAdapter daEmp = new OleDbDataAdapter(Query, oleDbConnection);

daEmp.Fill(dtEmp);
foreach(DataRow dr in dtEmp.Rows)
arList.Add(dr[0].ToString() +", "+dr[1].ToString());
comboBox1.DataSource = arList;

On suppose que la connexion OleDbConnection a t initialise autre part dans le programme.

Il existe une autre mthode plus lgante mais qui ne vous permet cependant pas dafficher deux
donnes (nom, prnom par exemple) dans une colonne. La voici illustre par lexemple qui suit :

string Query = "Select LastName, FirstName from Employees";


DataTable dtEmp = new DataTable();
OleDbDataAdapter daEmp = new OleDbDataAdapter(Query, oleDbConnection);

daEmp.Fill(dtEmp);
dtEmp.Columns[0].ColumnName = "LastName";
dtEmp.Columns[1].ColumnName = "FirstName";
comboBox1.DataSource = dtEmp;
comboBox1.DisplayMember = "LastName";
comboBox1.ValueMember = "FirstName";

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 33 / 37

Comme vous pouvez le voir, cette technique consiste utiliser le nom dune colonne. Lavantage par
rapport la technique prcdente, est que vous pouvez ici facilement mettre une valeur la fois dans les
proprits DisplayMember et ValueMember.

6.2. Le DataBinding dans le designer


Dans la section prcdente, on a pu voir comment manipuler le DataBinding dans le code. Cependant,
VS.NET permet darriver aux mmes rsultats en passant par le designer et en nutilisant que la souris.
Pour cela, il vous suffit de crer une connexion et un DataAdapter dans le designer (voir paragraphe
3.1.1.2).
Vous devez en suite gnrer un DataSet avec laide du DataAdapter.
Il ne vous reste plus qu binder le contrle dans lequel vous dsirez afficher les donnes avec laide
des proprits DataSource et DataMember du contrle en question (voir ci-dessous).

Figure 26 - Liaison du contrle la source de donne

6.3. DataView
DataView permet de crer une vue personnalise dune DataTable. Cela veut dire que lon peut
nafficher que certains lments de la DataTable et en omettre dautre sans pour autant la modifier. On
dit que lon filtre.
Il nest pas possible denlever ou dajouter une ou des colonnes de la table source.
Un DataView a les proprits : Sort, RowFilter et RowStateFilter. Ces proprits permettent de
customiser la vue sur la DataTable. Lavantage des DataView est de pouvoir tre utilis en tant que
Provider dans un DataBinding.

Voyons quelques proprits de la DataView :


AllowDelete : Obtient ou dfinit un boolen indiquant si lon peut supprimer des donnes. Ces
suppressions qui seront rpercutes sur la DataTable source.
AllowEdit : Obtient ou dfinit un boolen indiquant si lon peut modifier des donnes. Ces
modifications seront rpercutes sur la DataTable source.
AllowNew : Obtient ou dfinit un boolen indiquant si lon peut ajouter des donnes. Ces ajouts
seront rpercuts sur la DataTable sources.
RowFilter : Obtient ou dfinit une expression servant de filtre.
RowStateFilter : Obtient ou dfinit ltat des lignes utilis dans la DataView. Ces filtres
peuvent par exemple tre Deleted, CurrentRows, OriginalRows

Exemple :

private void CreateDataView()


{
DataView dataView = new DataView(ds.Tables["ProductDetails"], "Grams =
'0g'", "ProductID", DataViewRowState.CurrentRows);
dataView.AllowEdit = true;
dataView.AllowNew = true;
dataView.AllowDelete = true;
}

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 34 / 37

On ici que lon cre une DataView qui va afficher les donnes de la table "ProductDetails" dont le poids
est gal 0g. On pourra diter, ajouter et supprimer des lignes. Ces actions seront bien sur prises en
compte dans la DataTable source.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 35 / 37

7. Mise jour des donnes


7.1. En utilisant Command
La plus simple des faons de mettre jour des donnes est dutiliser les classes OleDbCommand ou
SqlCommand. En effet, il suffit de crer un objet Command, de spcifier votre requte SQL de mise
jour (INSERT, UDPATE ou DELETE), daffecter des valeurs aux paramtres sil y en a, et ensuite
dexcuter la commande.

Exemple dexcution dun ordre UPDATE :

OleDbConnection connection;
OleDbCommand command;
int rowAffected;

connection = new OleDbConnection("...");


command = new OleDbCommand("UPDATE MyTable " +
"SET MyField = 'MyValue'", connection);
connection.Open();
try
{
rowAffected = command.ExecuteNonQuery();
}
finally
{
connection.Close();
}

Linconvnient de cette mthode est quelle sapplique trs mal au mode dconnect. En effet, dans ce
cas le dveloppeur doit tre au courant des donnes mettre jour. Ds que les donnes sont complexes
et importantes en nombre, le travail devient trop grand et lintrt de travailler en mode dconnect
nest plus vrifi.

7.2. En utilisant DataSet et DataAdapter


Dans ce cas l, la mthode change, car nous travaillons en mode dconnect et de ce fait, nos
modifications ne sont prises en compte quen local. Il faut donc les rapatries dans la base de
donnes.

La mise jour des donnes seffectue en deux tapes :


Effectuer les changements sur les DataRows du DataTable (sans connexion la base de
donnes).
Transfrer les changements du DataTable vers la data source en une seule opration. On utilise
pour cela un DataAdapter.

7.2.1. Effectuer les changements


Il existe 2 manires dactualiser les DataRows. On peut modifier une valeur la fois :

dataRow["FieldName"] = "FieldValue";

On peut galement changer plusieurs valeurs en une seule opration :

dataRow.BeginEdit();
dataRow["Field1"] = "Value1";

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 36 / 37

dataRow["Field2"] = "Value2";
dataRow.EndEdit();

Un DataRow contient plusieurs versions des donnes pour un mme champ. Voici les diffrentes
valeurs de lnumration DataRowVersion :
Current : cest la valeur accessible en lecture
Original : cest la valeur originale du champ, quand la table a t cre
Proposed : cest la nouvelle valeur aprs le BeginEdit mais avant EndEdit
Default : cest la valeur par dfaut applique aux nouvelles lignes

Par dfaut, on accde toujours la valeur Current dun DataRow. Si besoin, on peut accder aux
diffrentes versions dun champ, en utilisant :
Row.HasVersion(DataRowVersion.Original) pour dterminer si ce type de valeur existe
Row["FieldName", DataRowVersion.Original] pour rcuprer la valeur correspondante la
version spcifie

Pour ajouter un DataRow, on utilise la mthode Add. Pour supprimer un DataRow utiliser la mthode
Delete. Delete positionne RowState Deleted, mais laisse le DataRow dans la collection. Pour
rellement supprimer un DataRow, il faut appeler Remove.

Attention : si lenregistrement est removed , il ne sera pas pris en compte dans la phase 2 du
processus dupdate du DataAdapter et lenregistrement correspondant dans la base ne sera pas
supprim.

Un DataRow possde galement un tat spcifi dans sa proprit RowState. Cela permet de parcourir
un DataTable dun DataSet et de savoir si un DataRow est nouveau, a t supprim, Lnumration
RowState possde les valeurs suivantes :
Added : le DataRow a t ajout dans la collection et AcceptChanges na pas t appel.
Deleted : le DataRow a t supprim avec la mthode Delete.
Detached : le DataRow a t cr, mais na pas encore t attach une table du DataSet.
Modified : le DataRow a t modifi et AcceptChanges na pas t appel.
Unchanged : le DataRow na pas subi de modification depuis le dernier appel
AcceptChanges ou depuis la cration du DataTable.

7.2.2. Transfrer les changements


Une fois que vous avez modifi vos lignes ou vos valeurs dans un DataSet, il faut appeler la mthode
Update du DataAdapter, en passant en paramtre le DataSet.

dataAdapter.Update(dataSet);

La mthode Update du DataAdapter va parcourir toutes les DataTable du DataSet, et pour chaque
DataTable, va parcourir tous les DataRow. Pour chaque DataRow, il va analyser son tat grce la
proprit RowState, et en fonction de cet tat, il va excuter la Command approprie. En effet, le
DataAdapter peut tre li des objets Command qui contiennent des requtes UPDATE, INSERT ou
DELETE.

Aprs la mise jour des donnes, le DataAdapter appelle la mthode AcceptChanges sur le DataSet, ce
qui permet daccepter tous les changements en une seule opration. En clair, la version Original de
chaque DataRow va prendre la mme valeur que celle de la version Current. Ainsi, si une nouvelle
mise jour lieu par un appel la mthode Update, aucune mise jour ne serait effectue dans la base
de donnes car les versions Current et Original sont identiques.
Si besoin dans votre code, vous pouvez appeler la mthode AcceptChanges ou RejectChanges.

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 37 / 37

8. DataSet typ
Quand on utilise un DataAdapter, on doit saisir une requte SQL de type SELECT pour rcuprer des
donnes. Eventuellement, on peut gnrer les requtes de mise jour.
Une autre fonctionnalit du DataAdapter est de pouvoir gnrer un DataSet typ. En fonction des
champs retourns par le SELECT, le DataAdapter va pouvoir gnrer une classe drive de la classe
DataSet, et qui contiendra comme proprits les champs retourns par le SELECT, et ces proprits
seront du bon type (par exemple, le champ ID sera de type Integer, le champ LastName sera du type
string, ). De cette manire, on peut manipuler les bons types de donnes au niveau de lapplication
(do le terme DataSet typ).

Lautre avantage de cette technique est de pouvoir poser ce DataSet typ directement sur votre fiche en
conception. Cela signifie que vous allez pouvoir poser des composants daffichage en conception
(TextBox, Label, DataGrid, ) et les relier (cest--dire effectuer un DataBind) directement sur les
bons champs, et cela en conception.

Pour crer un DataSet Typ, nous avons dj vu une mthode dans la partie DataAdapter de ce cours.
Une autre mthode est dutiliser un Schma XSD. Ce dernier peut tre fourni lorsque vous travaill avec
un Web Service mais vous pouvez galement le crer vous-mme. Nous ne dtaillerons pas davantage
cette dernire technique.

Une fois que votre DataSet typ est cr, vous pouvez remarquer que celui-ci est trs diffrent par
rapport un DataSet non typ notamment par lapparition de proprits ddies aux donnes contenues.
Citons par exemple lapparition de proprits du nom des tables prsentes dans le DataSet. Elle permet
de vous donner plus facilement accs aux donnes des tables comme, par exemple, avec des proprits
reprsentants les colonnes ( nomcolonneColumn ).

http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs

Vous aimerez peut-être aussi