Adonet
Adonet
com
ADO.NET
SUPINFO DOT NET TRAINING COURSE
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
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.
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
Ainsi, les objets ADO.NET se divisent en deux catgories : les fournisseurs de donnes manags et
lobjet DataSet + ses collections.
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.1.1. Connection
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
Une autre manire de crer dinstancier un objet Connection, est dutiliser le concepteur visuel
dapplication de Visual Studio .NET.
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
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
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.
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.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 10 / 37
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.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 11 / 37
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();
Try
{
connection.Open();
. . . . . . .
}
finally
{
connection.Close();
}
3.1.2. Command
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);
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
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
OleDbConnection connection;
OleDbCommand command;
int rowAffected;
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
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 15 / 37
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);
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;
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.
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.
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.
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
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.
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
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
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.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 23 / 37
VS.NET cre alors un onglet ddition supplmentaire dans sa fentre principale destin lcriture du
code de la procdure stocke nouvellement cre.
Une fois la commande enregistre lance, on peut constater que Visual Studio.NET modifie le code de
la procdure stocke.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 24 / 37
Exemple :
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.
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.
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 le fonctionnement :
Dans la partie Data de la ToolBox se trouve les composants DataAdapter. Double cliquez sur lun
deux. Un assistant va safficher :
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 :
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 :
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
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.
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
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
DataTable Constraints
Collection
DefaultView
Constraint
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.
http://www.labo-dotnet.com
Ce document est la proprit de SUPINFO et est soumis aux rgles de droits dauteurs
ADO.NET 30 / 37
Comme vous pouvez le remarquer, on peut facilement faire une correspondance entre les DataTable et
les tables des bases de donnes.
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.
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.
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" :
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.
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.
daEmp.Fill(dtEmp);
foreach(DataRow dr in dtEmp.Rows)
arList.Add(dr[0].ToString() +", "+dr[1].ToString());
comboBox1.DataSource = arList;
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 :
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.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.
Exemple :
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
OleDbConnection connection;
OleDbCommand command;
int rowAffected;
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.
dataRow["FieldName"] = "FieldValue";
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.
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