Académique Documents
Professionnel Documents
Culture Documents
ADO.NET
Base de Donnes
Sommaire
1
Introduction ..................................................................................................................................... 3
2.1
2.2
2.3
Interface portable.................................................................................................................... 9
2.4
3.2
3.3
Dconnexion .......................................................................................................................... 17
4.2
4.3
4.4
4.5
4.6
Les BLOBs............................................................................................................................... 28
4.7
Le DataReader ....................................................................................................................... 28
4.8
4.9
4.9.1
4.9.2
Le DataSet ............................................................................................................................. 32
5.2
5.2.1
5.2.2
5.2.3
Le DataRelation ............................................................................................................. 34
14/09/08
5.2.4
5.2.5
5.3
5.3.1
5.3.2
5.3.3
5.4
Le DataAdapter ..................................................................................................................... 38
5.4.1
5.4.2
5.4.3
Le MissingMappingAction ............................................................................................. 39
5.4.4
Le MissingSchemaAction ............................................................................................... 39
5.5
5.5.1
5.5.2
5.5.3
5.6
Le DataView........................................................................................................................... 42
5.6.1
5.6.2
5.7
Exemples................................................................................................................................ 43
5.7.1
5.7.2
Conclusion ..................................................................................................................................... 47
14/09/08
1 Introduction
Ce chapitre porte sur la gestion de base de donnes grce lADO.NET. LADO.NET
permet de reli une application une base de donnes. La nouveaut de lADO.NET par
rapport son anctre lADO est la gestion de donnes dans une application dans un
environnement dconnect. Ce mode, par rapport au mode connect classique, possde
plusieurs avantages et inconvnients. Ces deux modes sont utilisables avec les fournisseurs
de base de donnes qui seront cits plus loin dans le chapitre.
Bon cours .NET
Lquipe ADO.NET.
14/09/08
14/09/08
Chaque fournisseur est reli une base de donnes propre, c'est--dire quil est compatible
lAPI de sa base de donnes. Cependant, les bases de donnes peuvent implmenter
plusieurs API (par exemple en installant certains pilotes comme ODBC pour lODBC) :
Fournisseur
Description
SQL Server
OLE DB
ODBC
Oracle
Remarque : SQL Server et Oracle sont tout deux des fournisseurs de donnes manags.
C'est--dire quils sont optimiss pour certains types de bases de donnes.
14/09/08
Afin que laccs aux donnes soit sr, les fournisseurs de donnes doivent tre
disponibles sur le poste de travail. La mthode GetFactoryClasses de la classe
DbProviderFactories permet de donner les fournisseurs disponibles sur le poste de travail en
question. Il faut, par contre, ajouter lespace de nom System.Data.Common. Par exemple :
VB
Imports System.Data;
Imports System.Data.Common;
//A rajouter
Sub Main()
Dim listeFournisseur As DataTable
listeFournisseur = DbProviderFactories.GetFactoryClasses()
For Each colonne As DataColumn In listeFournisseur.Columns
Console.Write(colonne.ColumnName + vbTab)
' Affiche le nom des colonnes
Next
Console.WriteLine(vbNewLine + vbNewLine)
For Each ligne As DataRow In listeFournisseur.Rows
' Affiche chaque ligne
For Each colonne As DataColumn In listeFournisseur.Columns
' Affiche les cellules
Console.Write(ligne.Item(colonne.ColumnName) + vbTab)
Next
Console.WriteLine(vbNewLine + vbNewLine) ' Retour la ligne
Next
End Sub
14/09/08
//C#
using System.Data;
using System.Data.Common;
//A rajouter
14/09/08
Description
Command
CommandBuilder
Connection
DataAdapter
DataReader
Transaction
Remarque : La classe Connection napparat pas dans le Framework 3.5. En effet, les classes
des fournisseurs manags ont leur propre classe tel que SqlConnection.
14/09/08
Description
IDataAdapter
IDataReader
IDataParameter
IDbCommand
IDbConnection
IDbDataAdapter
IDbTransaction
Ces interfaces ne montrent pas ltendue des possibilits que peut donner un fournisseur
manag. En effet, les fournisseurs manags comprennent leurs propres classes permettant
plus dactions ou en les amliorant.
14/09/08
10
Imports System.Data;
Imports System.Data.Common;
Imports System.Data.SqlClient;
//A rajouter
Sub Main()
Dim requete, connexionString As String
connexionString = "Data Source=.\SQLServeur;Initial
Catalog=DotNetFrance;Integrated Security=true;"
requete = "SELECT * FROM Employe"
Dim connexion As IDbConnection = New
SqlConnection(connexionString)
Dim commande As IDbCommand = connexion.CreateCommand()
commande.CommandText = requete
commande.CommandType = CommandType.Text
connexion.Open()
Dim lire As IDataReader = commande.ExecuteReader()
While (lire.Read())
Console.WriteLine("ID : {0} | Nom : {1} | Prenom : {2} |
RoleNumero : {3}", lire.GetInt32(O), lire.GetString(1), lire("Prenom"),
lire("Role"))
End While
connexion.Close()
connexion.Dispose()
Console.ReadLine()
End Sub
14/09/08
11
//C#
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
//A rajouter
12
jour. Ceci est possible grce au DataSet. Cest pourquoi, il existe deux types de
fonctionnements :
Le mode connect
Le mode dconnect
Avantages
Inconvnients
Connect
Linconvnient se trouve
surtout au niveau des
ressources. En effet, tous les
utilisateurs ont une
connexion permanente avec
le serveur. Mme si
lutilisateur ny fait rien la
connexion gaspille beaucoup
de ressource entrainant
aussi des problmes daccs
au rseau.
Dconnect
Il nexiste pas un mode meilleur que lautre, tout dpend de lutilisation que lon compte en
faire.
14/09/08
13
SqlConnection connexion
Description
Connect Timeout
Connection LifeTime
Connection Reset
Data Source
Initial Catalog
14/09/08
14
Integrated Security
Pwd
Pooling
User ID
Description
Broken
Closed
Connecting
Executing
Fetching
Open
14/09/08
15
14/09/08
16
Connection Lifetime
Connection Reset
Enlist
Par dfaut
Description
True
True
100
14/09/08
17
Pooling
True
Object
Description
ClearAllPool
SqlConnection et
OracleConnection
ClearPool
SqlConnection et
OracleConnection
OleDbConnection et
Odbcconnection
Spcifie au pool de
connexions qu'il peut tre
dtruit lorsque la dernire
connexion qu'il contenait a
t dtruite.
ReleaseObjectPool
3.3 Dconnexion
Pour couper la connexion entre lapplication et la base de donnes, il suffit dcrire :
VB
nomConnexion.Close()
//C#
nomConnexion.Close();
14/09/08
18
4 Mode connect
4.1 Les commandes
Contrairement une base de donnes, les requtes SQL et les procdures stockes
sont excutes partir de commandes. Les commandes contiennent toutes les informations
ncessaires leur excution et effectuent des oprations telles que crer, modifier ou
encore supprimer des donnes dune base de donnes. Vous utilisez ainsi des commandes
pour faire des excutions de requtes SQL qui renvoient les donnes ncessaires.
Remarque : les requtes SQL et les procdures stockes sont deux choses diffrentes. En
effet les procdures stockes sont des requtes SQL dj enregistres dans la mmoire
cache du serveur.
Chaque fournisseur de base de donnes possde leurs propres objets Command qui sont les
suivantes :
Nom
SqlCommand
SQL Server
OleDbCommand
OLE DB
OdbcCommand
ODBC
OracleCommand
Oracle
Il existe plusieurs proprits et mthodes communes chaque fournisseur pour grer des
commandes, voici les principales :
Proprits
Nom
Description
CommandText
CommandTimeout
14/09/08
19
CommandType
Connection
Parameters
Transaction
Mthodes
Nom
Description
Cancel
ExecuteNonQuery
ExecuteReader
ExecuteScalar
ExecuteXMLReader
Vous pouvez aussi manipuler des vnements. Voici les deux principaux :
Evnements
Description
Disposed
14/09/08
20
14/09/08
21
14/09/08
22
//C#
Afin dexcuter une instruction SQL qui renvoie plusieurs valeurs, on peut utiliser la
mthode ExecuteReader; elle va retourner lobjet Datareader qui va permettre la lecture des
donnes. Si linstruction SQL ne doit renvoyer quune valeur unique, on peut utiliser la
mthode ExecuteScalar qui va la fois soccuper de lexcution et retourner la valeur.
14/09/08
23
Voici, par exemple, un code permettant dafficher la base de donnes Dot-Net France :
VB
//C#
14/09/08
24
Vous pouvez galement excuter des commandes qui vous renvoient les donnes au
format XML. Pour cela vous devez rgler la proprit CommandText de votre instruction SQL
au format XML puis faire appel la mthode ExecuteXMLReader qui retourne un objet
XmlReader (dont la classe est stocke dans System.Xml). Lorsque vous configurez votre
commande, vous pouvez utiliser le Query Designer afin de crer et de personnaliser vos
requtes. Donc vous devez slectionner votre base de donnes dans le Server Explorer puis
cliquer sur New Query. Vous ouvrez ainsi le Query Designer et pourrez alors non seulement
crer votre requte mais en plus la personnaliser (tableau, affichage).
Durant un change entre une application et une base de donnes, lapplication est
bloque durant lattente de la rponse du serveur. Pour remdier ce problme, lADO.NET
propose les commandes asynchrones. En effet, ces commandes permettent lapplication
de faire autre chose en attendant la rponse du serveur.
Voici les mthodes qui sont utilises lors dun processus asynchrone :
Mthodes
Description
BeginExecuteNonQuery
BeginExecuteReader
BeginExecuteXmlReader
EndExecuteNonQuery
EndExecuteReader
EndExecuteXmlReader
14/09/08
25
le premier est de type Input, c'est--dire que vous voulez utiliser un paramtre pour
envoyer des donnes la base de donnes.
le second est le type Output qui lui est utilis lorsquon veut rcuprer des donnes.
-
le troisime est lInputOutput qui est exploit pour faire les deux actions
prcdentes, c'est--dire envoyer et rcuprer des donnes.
enfin le dernier type est le ReturnValue qui retourne simplement une valeur
assigne.
14/09/08
26
La classe SqlParameter permet de crer des objets de type Sqlparameter contenant : le nom,
la valeur et la direction dutilisation du paramtre.
Voici un exemple permettant dajouter un utilisateur dans la base de donnes
DotNetFrance :
VB
14/09/08
27
//C#
Remarque : Vous pouvez aussi ajouter des paramtres vos Command Object en saisissant
la mthode GetCostCommand.
14/09/08
28
4.7 Le DataReader
Le DataReader permet un accs en lecture seule des enregistrements, c'est--dire quil est
impossible de revenir en arrire sur les enregistrements lus. Il na t cr que pour la
lecture pure et simple de donnes. Le DataReader doit toujours tre associ une
connexion active, c'est--dire quil ne peut pas se dconnecter, effectuer quelque chose puis
se reconnecter pour une mise jour.
Il existe plusieurs Datareader suivant le fournisseur utilis, par exemple nous avons
SqlDataReader ou encore OracleDataReader.
Le DataReader comprend plusieurs mthodes : GetBytes, GetChars ou GetString. GetString
servent pour les donnes caractres ; GetBytes et GetChars permettent de retourner une
valeur de type long, qui reprsente le nombre de caractres ou doctets retourns.
14/09/08
29
//C#
De plus les transactions reposent sur le principe de quatre caractristiques appel ACID qui
apporte plus de clart sur la dfinition dune transaction :
Atomicit, qui signifie que la mise jour de la base de donnes doit tre totale ou
nulle, cest le principe du tout ou rien.
-
Cohrence, qui indique que les modifications apportes doivent tre valides.
Isolation, qui dfinit que les transactions lances au mme moment ne doivent pas
sinterfrer entre elles.
-
Durabilit, qui assure que toutes les transactions sont lances de manire dfinitive.
14/09/08
30
soit de valider vos transactions grce la mthode Commit soit de les annuler grce la
mthode Rollback.
Les niveaux disolation vous permettent de grer les problmes dintgrit des
donnes ainsi que des accs simultans celles-ci par le biais des transactions. Vous
trouverez ci-dessous la liste des proprits IsolationLevel associs lobjet Transaction :
Nom
Description
Chaos
ReadCommitted
ReadUncommitted
RepeatableRead
Serializable
Les verrouillages sont placs sur toutes les donnes qui sont
utilises dans une requte, ce qui empche dautres utilisateurs
de mettre jour les donnes.
Snapshot
Unspecified
14/09/08
31
VotreConnexion.EnlistTransaction(activeTransaction)
//C#
VotreConnexion.EnlistTransaction(activeTransaction) ;
14/09/08
32
5 Mode dconnect
5.1 Le DataSet
Le DataSet est stock dans lespace de nom System.Data. Cest un cache de donnes
en mmoire, c'est--dire quil permet de stocker temporairement des donnes utilises dans
votre application. Le DataSet contient la collection dobjets DataTable qui peuvent tre lis
avec les objets DataRelation. Dans le cas du mode dconnect, cet objet va nous permettre
d'importer la partie dsire de la base de donnes (fonction de la requte de slection) en
local. Ainsi grce des objets ncessaire la connexion classique (commande select,
connections string...) et un DataAdapter, nous pourrons relier ("Binder") un DataSet sur une
base de donne (en lecture et en criture grce a une mthode de mise a jour de la base de
donne).
Grce au mot cl foreach, on peut parcourir des DataSet ou les requter en Linq.
La cration dun DataSet peut se faire via plusieurs mthodes :
On peut le crer par programmation en crant des objets DataTable, DataRelation
(facultatif). Il suffit ensuite de remplir la ou les base(s) de donnes.
Vous pouvez aussi utiliser le Designer DataSet et lassistant de configuration de Data
Source afin de crer un objet DataSet. Pour cela vous devez mettre en place le
processus de connexion des donnes en slectionnant une base de donnes
disponible, qui permettra de mettre en place un DataSet typ. Ainsi cela gnra le
code ncessaire pour cette cration.
Vous pouvez aussi glisser directement un DataSet depuis la Toolbox sur votre Form
(cas pour le WinForm)
14/09/08
33
Description
DataTable
DataColumn
DataRow
Pour crer un DataSet, il faut en premier lieu les instancier (vous pouvez aussi dfinir
leur nom) :
VB
14/09/08
34
//C#
5.2.3 Le DataRelation
//C#
Ensuite, grce cette relation, vous pouvez naviguer entre les colonnes de vos tables. Le
DataRow propose deux mthodes : le GetParentRow et le GetChildRows :
Mthode
Description
GetParentRows
GetChildRows
Par exemple, nous pouvons afficher les ID de notre prcdente relation EmployeRole :
VB
//C#
14/09/08
35
La mthode Merge permet de fusionner deux DataSet entre eux. On prend un DataSet
source quon fusionne avec un DataSet cibl. Pour des tables identiques, ce sont les donnes
du DataSet source qui remplaceront les donnes du DataSet cibl. Lorsquil sagit de deux
DataSet diffrents, vous pouvez paramtrer la mthode Merge avec la proprit
MissingSchemaAction. Voici les diffrentes valeurs de ce paramtre :
Valeur
Description
Add
AddWithKey
Error
Ignore
Vous pouvez par exemple vouloir modifier pour une srie de test un DataSet. Pour cela, il est
trs simple de copier un DataSet. Il suffit dutiliser la mthode Copy :
VB
//C#
14/09/08
36
Dans une base de donnes, vous pouvez avoir besoin de crer des colonnes contenant
des expressions. Ceci fonctionne un peu comme avec un tableau Microsoft Excel, vous
pouvez crer des expressions dans une colonne qui permet de calculer une somme, une
multiplication ou autre plus complexe. Il existe pour cela lobjet Expression :
VB
//C#
Remarque : Si vous grez des nombres virgules, changez le paramtre Decimal en Double.
5.3.2 Lincrmentation dans une DataTable
14/09/08
37
Une DataTable, l'image des contraintes dans les bases de donnes relationnelles, peut
galement avoir des contraintes appliques certaines de ses colonnes.
Rappel : En SQL, une cl primaire permet didentifier de manire unique chaque ligne dune
table. Les champs associs une cl primaire ont une valeur unique dans une table. Une cl
trangre permet de faire une rfrence vers une autre colonne de la table ou vers une
autre table, possdant obligatoirement une cl primaire. Par exemple cette base de
donnes :
Il existe les mmes deux types de cls : les cls trangres et les cls primaires.
Les cls primaires : Pour installer une cl primaire une valeur unique, il suffit de
crer linstance de la classe UniqueConstraint et dassigner la colonne avec la valeur
unique au constructeur.
Les cls trangres : Afin dajouter une cl une ou plusieurs colonnes voir plusieurs
tables parents aux colonnes enfants il faut faire linstance de la classe
ForeignKeyConstraint. Cette classe possde les proprits DeleteRule et UpdateRule
qui permet de dfinir le comportement. Il en existe quatre valeurs :
Valeur
Description
Cascade
None
SetDefault
SetNull
14/09/08
38
5.4 Le DataAdapter
Lobjet DataAdapter permet de relier un DataSet une base de donnes. En revanche
le DataAdapter change suivant le fournisseur, c'est--dire, par exemple, pour une base de
donnes SQL, ce sera SqlDataAdapter. Cest grce cela que votre application pourra
communiquer avec la base de donnes et par exemple mettre jour celle-ci.
Pour crer un DataAdapter, il faut tout dabord instancier celui correspondant votre
fournisseur. Il a besoin dune commande pour fonctionner. Par exemple :
VB
//C#
VB
14/09/08
39
5.4.3 Le MissingMappingAction
Cette proprit permet de rgler certains conflits entre un DataSet et une base de
donnes. En effet des conflits peuvent arriver si on tente par exemple de remplir un DataSet
(avec une base de donnes) dans lequel il manque soit des colonnes ou des tables.
Description
Error
Ignore
Passthrough
5.4.4 Le MissingSchemaAction
Cette proprit permet aussi de rgler les conflits entre un DataSet et une base de donnes.
Il permet de spcifier o et comment ajouter des donnes dans des DataTable et
DataColumn manquante. Voici les valeurs de lnumration MissingMappingAction :
Valeur
Description
Add
AddWithKey
Error
Ignore
14/09/08
40
Afin dajouter des donnes dans une DataTable, il faut tout dabord crer un nouveau
DataRow. Aprs avoir cr votre ligne, vous pouvez y ajouter vos valeurs. Par exemple, nous
pouvons ajouter un nouvel utilisateur notre base de donnes avec un ID, Nom, Prenom et
le role :
VB
Vous pouvez aussi diter ou supprimer des donnes dans votre DataTable comme ceci :
Langage
Modifier
Supprimer
C#
MaLigne.Delete() ;
VB
MaLigne.Delete
Le RowState vous permet de grer le statut dune ligne. Par dfaut, il se trouve sur
Unchanged. Voici les valeurs possibles de cette numration :
Valeur
Description
Added
Deleted
Detached
14/09/08
41
Modified
Unchanged
Description
ColumnChanged
ColumnChanging
Disposed
Initialized
RowChanged
RowChanging
RowDeleted
RowDeleting
TableCleared
TableClearing
TableNewRow
14/09/08
42
5.6 Le DataView
Un DataView permet davoir une vue dune DataTable. Cela permet aussi de
pouvoir la trier, la modifier. La fonction principale de cet objet est de relier une base de
donnes aux applications WinForm et WebForm.
5.6.1
Crer un DataView
La proprit Sort du DataView permet de le trier. On peut le trier de deux faons : ASC
(croissant) et DESC (dcroissant). La faon croissante est par dfaut utilise par le DataView.
VB
DataRowView("Nom") = "Jeremie"
14/09/08
43
//C#
DataRowView("Nom") = "Jeremie";
5.7 Exemples
5.7.1 Remplissage automatique / Lecture de donnes
VB
'Affichage du DataSet
Console.WriteLine("Nom de la table : {0} | Il possde {1}
enregistrement(s)" + vbNewLine + vbNewLine + vbNewLine, ds.Tables(0),
ds.Tables("Table").Rows.Count) 'On affiche les informations que lon tire
du DataSet
For Each colonne As DataColumn In ds.Tables(0).Columns 'Affichage des noms des
colonnes
Console.Write(colonne.ColumnName + vbTab)
Next
Console.WriteLine(vbNewLine + vbNewLine)
For Each ligne As DataRow In ds.Tables(0).Rows 'Afichage des enregistrements
14/09/08
44
//C#
14/09/08
45
Module Module1
Sub Main()
Dim ds As DataSet = New DataSet("Dotnet-France")
Dim stagiaires As DataTable = New DataTable("Stagiaires")
' cette table contient trois champs renseigner pour chaque enregistrement
stagiaires.Columns.Add("ID", GetType(Integer)
' l'id
stagiaires.Columns.Add("Nom", GetType(String)) ' le nom
stagiaires.Columns.Add("Description", GetType(String)) ' description
' mthode du dictionnaire
Dim dnom As Dictionary(Of String, String)= New Dictionary(Of String,
String)()
dnom.Add("Cdric", "Stagiaire")
dnom.Add("Christophe", " Stagiaire ")
' pour chaque paire
d'lments nous allons ajouter des enregistrements
For Each elem As KeyValuePair(Of String, String) In dnom
stagiaires.Rows.Add(Class1.StagiaireID, elem.Key, elem.Value)
Next
' des listes
Dim nom() As String = {"Jrmy", "Cdric"}
Dim desc As String() = {"Manager ", "Manager"}
' s'il y a beaucoup
de champs pour des raisons de lisibilits il peut etre prfrable
' de ranger chaque liste dans un Dictionary<string,List<string>>
For i = 0 To nom.Length - 1 Step 1
stagiaires.Rows.Add(Class1.StagiaireID, nom(i), desc(i))
Next
' et comme vous l'aurez compris :remplissage brut
' (s'il n'y a que trs peut d'entre peut etre une bonne solution)
stagiaires.Rows.Add(Class1.StagiaireID, "Paul", "Stagiaire")
stagiaires.Rows.Add(Class1.StagiaireID, "Quentin", "Stagiaire")
' on peut ranger notre table dans notre DataSet
ds.Tables.Add(stagiaires)
' donc nous allons afficher pour prouver le fonctionnement
' les donnes dans un terminal
For Each row As DataRow In ds.Tables("stagiaires").Rows
For Each col As DataColumn In stagiaires.Columns
Console.Write(row.Item(col.ColumnName).ToString() + vbTab)
Next
' retour la ligne entre chaque enregistrement.
Console.WriteLine()
Next
Console.ReadLine()
End Sub
Public Class Class1
' on cre une valeur id avec acesseur pour l'auto incrementation
Private Shared _stagiaireid As Int32 = 0
Public Shared ReadOnly Property StagiaireID() As Int32
Get
_stagiaireid += 1
Return _stagiaireid
End Get
End Property
End Class
End Module
14/09/08
46
//C#
class MainClass
{
public static void afficheTable(DataSet ds, string tableName)
{
foreach (DataColumn col in ds.Tables[tableName].Columns)
{
Console.Write(col.ColumnName + "\t");
}
Console.WriteLine();
foreach (DataRow row in ds.Tables[tableName].Rows)
{
foreach (DataColumn col in ds.Tables[tableName].Columns)
{
Console.Write(row[col.ColumnName].ToString() + "\t");
}
Console.WriteLine();
}
Console.WriteLine("\n");
}
private static int _stagiaireid = 0;
public static int StagiaireID { get { return _stagiaireid++; } }
public static void Main(string[] args)
{
DataSet ds = new DataSet("dotnet-france");
DataTable stagiaires = new DataTable("stagiaires");
// cette table contient trois champs renseigner pour
// chaque enregistrement l'id, le nom et la description
stagiaires.Columns.Add("id", typeof(int));
stagiaires.Columns.Add("nom ", "text".GetType());
stagiaires.Columns.Add("description", typeof(string));
// Rangement dans une collection gnrique
Dictionary<string, string> dnom = new Dictionary<string, string>();
dnom.Add("Cdric", "Stagiaire");
dnom.Add("Christophe", "Stagiaire");
foreach (KeyValuePair<string, string> elem in dnom)
{
stagiaires.Rows.Add(StagiaireID, elem.Key, elem.Value);
}
// dans des listes
string[] nom = { "Jrmy", "Cdric" };
string[] desc = { "Manager", "Manager" };
for (int i = 0; i < nom.Length; i++)
{
stagiaires.Rows.Add(StagiaireID, nom[i], desc[i]);
}
// remplissage brut
stagiaires.Rows.Add(StagiaireID, "Paul", "Stagiaire");
stagiaires.Rows.Add(StagiaireID, "Quentin", "Stagiaire");
ds.Tables.Add(stagiaires);
afficheTable(ds, "stagiaires");
}
}
14/09/08
47
6 Conclusion
Vous avez termin ce chapitre sur la gestion de bases de donnes avec ADO.NET.
Comme vous avez pu le constater, le mode connect et dconnect ont chacun des utilits ainsi
quune utilisation diffrentes.
Lquipe ADO.NET.
14/09/08