ADO.NET - Base de Données.pdf

Embed Size (px)

Citation preview

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    1/47

    1 Base de donnes (ADO.NET)

    14/09/08

    ADO.NETBase de Donnes

    Sommaire

    1 Introduction ..................................................................................................................................... 3

    2 Les bases de donnes ...................................................................................................................... 3

    2.1 Les fournisseurs de donnes ................................................................................................... 3

    2.2 Accder la base de donnes ................................................................................................. 8

    2.3 Interface portable .................................................................................................................... 9

    2.4 Mode connect / Mode dconnect ..................................................................................... 11

    3 Etablir une connexion .................................................................................................................... 13

    3.1 Les chanes de connexions .................................................................................................... 13

    3.2 Les pools de connexions ........................................................................................................ 16

    3.3 Dconnexion .......................................................................................................................... 17

    4 Mode connect ............................................................................................................................. 18

    4.1 Les commandes ..................................................................................................................... 18

    4.2 Utiliser des commandes ........................................................................................................ 20

    4.3 Les paramtres de commandes SQL ..................................................................................... 25

    4.4 Les types de paramtres ....................................................................................................... 25

    4.5 Crer un paramtre ............................................................................................................... 25

    4.6 Les BLOBs............................................................................................................................... 28

    4.7 Le DataReader....................................................................................................................... 28

    4.8 Copier un grand nombre de donnes ................................................................................... 28

    4.9 Les transactions ..................................................................................................................... 29

    4.9.1 Niveau disolations des transactions ............................................................................. 30

    4.9.2 Les transactions Distribues .......................................................................................... 31

    5 Mode dconnect ......................................................................................................................... 32

    5.1 Le DataSet............................................................................................................................. 32

    5.2 Configurer un DataSet........................................................................................................... 33

    5.2.1 Crer un DataSet........................................................................................................... 33

    5.2.2 Ajouter des DataTable................................................................................................... 33

    5.2.3 Le DataRelation ............................................................................................................. 34

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    2/47

    2 Base de donnes (ADO.NET)

    14/09/08

    5.2.4 Fusionner deux DataSet................................................................................................ 35

    5.2.5 Copier un DataSet......................................................................................................... 35

    5.3 Configurer une DataTable ..................................................................................................... 36

    5.3.1 Crer des colonnes contenant des expressions ............................................................ 36

    5.3.2 Lincrmentation dans une DataTable .......................................................................... 36

    5.3.3 Les contraintes dans une DataTable ............................................................................. 37

    5.4 Le DataAdapter..................................................................................................................... 38

    5.4.1 Crer un DataAdapter................................................................................................... 38

    5.4.2 Crer des commandes pour un DataAdapter............................................................... 38

    5.4.3 Le MissingMappingAction ............................................................................................. 39

    5.4.4 Le MissingSchemaAction............................................................................................... 39

    5.5 Grer une DataTable............................................................................................................. 40

    5.5.1 Ajouter des donnes ..................................................................................................... 40

    5.5.2 Grer des donnes ........................................................................................................ 40

    5.5.3 Les vnements dune DataTable ................................................................................. 41

    5.6 Le DataView........................................................................................................................... 42

    5.6.1 Crer un DataView........................................................................................................ 42

    5.6.2 Grer un DataView........................................................................................................ 42

    5.7 Exemples................................................................................................................................ 43

    5.7.1 Remplissage automatique / Lecture de donnes .......................................................... 43

    5.7.2 Remplissage manuel du DataSet ................................................................................... 45

    6 Conclusion ..................................................................................................................................... 47

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    3/47

    3 Base de donnes (ADO.NET)

    14/09/08

    1 IntroductionCe 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.

    2 Les bases de donnes2.1 Les fournisseurs de donnes

    Chaque fournisseur de donnes permet la communication avec un type de base de

    donnes au travers dune API. Une API (Application Programming Interface) est linterface

    qui permet laccs de logiciel par un autre. Ces fournisseurs permettent de rcuprer et de

    transfrer des modifications entre lapplication et une base de donnes. Toutes les classes

    permettant dutiliser ces fournisseurs se trouvent dans lespace de nom System.Data.

    Sur le Framework 3.5, il existe quatre types de fournisseurs :

    Sql Server OLE DB OBDC Oracle

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    4/47

    4 Base de donnes (ADO.NET)

    14/09/08

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    5/47

    5 Base de donnes (ADO.NET)

    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 Les classes de ce fournisseur se trouvent dans lespace de nom

    System.Data.SqlClient, chaque nom de ces classes est prfix par

    Sql. SQL Server accs au serveur sans utiliser dautres couches

    logicielles le rendant plus performant.

    OLE DB Les classes de ce fournisseur se trouvent dans lespace de nom

    System.Data.OleDb, chaque nom de ces classes est prfix par

    OleDb. Ce fournisseur exige linstallation de MDAC (Microsoft

    Data Access Components). Lavantage de ce fournisseur est quilpeut dialoguer avec nimporte quelle base de donnes le temps

    que le pilote OLE DB est install dessus, mais par rapport SQL

    server, OLE DB utilise une couche logicielle nomme OLE DB ; il

    requiert donc plus de ressources diminuant par consquent les

    performances.

    ODBC Les classes de ce fournisseur se trouvent dans lespace de nom

    System.Data.Odbc, chaque nom de ces classes est prfix par

    Odbc. Tout comme lOLE DB, ODBC exige linstallation de MDAC.Il fonctionne avec le mme principe quOLE DB mais au lieu

    dutiliser une couche logicielle, il utilise le pilote ODBC.

    Oracle Les classes de ce fournisseur se trouvent dans lespace de nom

    System.Data.OracleClient, chaque nom de ces classes est prfix

    par Oracle. Il permet simplement de se connecter une source

    de donnes 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.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    6/47

    6 Base de donnes (ADO.NET)

    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 DataTablelisteFournisseur = DbProviderFactories.GetFactoryClasses()

    ForEach colonne As DataColumn In listeFournisseur.Columns

    Console.Write(colonne.ColumnName + vbTab)' Affiche le nom des colonnes

    NextConsole.WriteLine(vbNewLine + vbNewLine)

    ForEach ligne As DataRow In listeFournisseur.Rows' Affiche chaque ligneForEach colonne As DataColumn In listeFournisseur.Columns

    ' Affiche les cellulesConsole.Write(ligne.Item(colonne.ColumnName) + vbTab)

    NextConsole.WriteLine(vbNewLine + vbNewLine) ' Retour la ligne

    Next

    EndSub

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    7/47

    7 Base de donnes (ADO.NET)

    14/09/08

    //C#

    using System.Data;

    using System.Data.Common;

    //A rajouter

    staticvoid Main(string[] args){

    DataTable listeFournisseur =DbProviderFactories.GetFactoryClasses();

    foreach (DataColumn colonne in listeFournisseur.Columns){

    Console.Write(colonne.ColumnName + "/t");//Affiche le nom des colonnes

    }Console.WriteLine("/n/n");

    foreach (DataRow ligne in listeFournisseur.Rows)//Affiche chaque ligne{

    foreach (DataColumn colonne in listeFournisseur.Columns)// Affiche les cellules{

    Console.Write(ligne[colonne.ColumnName] + "/t");}Console.WriteLine("/n/n"); //Retour la ligne

    }

    Console.Read();}

    Vous devriez avoir un rsultat semblable :

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    8/47

    8 Base de donnes (ADO.NET)

    14/09/08

    2.2 Accder la base de donnesPour dialoguer avec la base de donnes, tous ces fournisseurs implmentent six

    classes de bases :

    Classe Description

    Command Stocke les informations sur la commande et

    permet son excution sur le serveur de base

    de donnes.

    CommandBuilder Permet de gnrer automatiquement des

    commandes ainsi que des paramtres pour

    un DataAdapter.

    Connection Permet dtablir une connexion une source

    de donnes spcifie.

    DataAdapter Permet le transfert de donnes de la base de

    donnes vers l'application et inversement

    (par exemple pour une mise jour,

    suppression ou modification de donnes). Il

    est utilis en mode dconnect (voir partie

    5.4).

    DataReader Permet un accs en lecture seule une

    source de donnes.

    Transaction Reprsente une transaction dans le serveur

    de la base de donnes.

    Remarque : La classe Connectionnapparat pas dans le Framework 3.5. En effet, les classes

    des fournisseurs manags ont leur propre classe tel que SqlConnection.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    9/47

    9 Base de donnes (ADO.NET)

    14/09/08

    2.3 Interface portableLes classes de chaque fournisseur varient, et donc par consquence, le code devient

    spcifique un fournisseur. Mais il existe une solution pour remdier ce problme : on

    peut utiliser comme type de donnes les interfaces quelles implmentent. En effet, les

    classes spcifiques aux fournisseurs permettront juste dtablir la connexion, on pourra

    ensuite utiliser que ces interfaces. Les six classes donnes dans le tableau prcdent

    implmentent leurs interfaces respectives :

    Interface Description

    IDataAdapter Permet de remplir et actualiser un objet

    DataSetet de mettre jour une source de

    donnes.

    IDataReader Permet de lire un ou plusieurs flux de

    donnes en lecture seule la suite de

    lexcution dune commande.

    IDataParameter Permet dimplmenter un paramtre pour

    une commande.

    IDbCommand Permet de donner une commande qui

    sexcutera au moment de la connexion une source de donnes.

    IDbConnection Reprsente une connexion unique avec une

    source de donnes.

    IDbDataAdapter Reprsente un jeu de mthodes qui permet

    dexcuter des oprations sur des bases de

    donnes relationnelles (insertion, slection,

    ).

    IDbTransaction Reprsente une transaction excuter au

    niveau dune source de donnes.

    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.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    10/47

    10 Base de donnes (ADO.NET)

    14/09/08

    Voici un exemple de code utilisant ces interfaces :

    VB

    Imports System.Data;

    Imports System.Data.Common;

    Imports System.Data.SqlClient;

    //A rajouter

    Sub Main()Dim requete, connexionString AsStringconnexionString = "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 = requetecommande.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"))

    EndWhile

    connexion.Close()connexion.Dispose()

    Console.ReadLine()EndSub

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    11/47

    11 Base de donnes (ADO.NET)

    14/09/08

    //C#

    using System.Data;

    using System.Data.Common;

    using System.Data.SqlClient;

    //A rajouter

    staticvoid Main(string[] args){

    string requete, connexionString;connexionString = @"Data Source=.\SQLServeur;Initial

    Catalog=DotNetFrance;Integrated Security=true;";requete = "SELECT * FROM Employe";

    IDbConnection connexion = newSqlConnection(connexionString);IDbCommand commande = connexion.CreateCommand();

    commande.CommandText = requete;commande.CommandType = CommandType.Text;

    connexion.Open();IDataReader lire = 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"]);

    }connexion.Close();connexion.Dispose();

    Console.ReadLine();}

    Cela donnera quelque chose de semblable :

    2.4 Mode connect / Mode dconnectLADO.NET permet de sparer les actions daccs ou de modification dune base de

    donnes. En effet, il est possible de manipuler une base de donnes sans tre connect

    celle-ci, il suffit juste de se connecter pendant un court laps de temps afin de faire une mise

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    12/47

    12 Base de donnes (ADO.NET)

    14/09/08

    jour. Ceci est possible grce au DataSet. Cest pourquoi, il existe deux types de

    fonctionnements :

    Le mode connect Le mode dconnect

    Ci-aprs, la diffrence par avantages et inconvnients :

    Mode Avantages Inconvnients

    Connect Avec un mode connect, la

    connexion est permanente,

    par consquence les

    donnes sont toujours

    jour. De plus il est facile de

    voir quels sont les

    utilisateurs connects et sur

    quoi ils travaillent. Enfin, la

    gestion est simple, il y a

    connexion au dbut de

    lapplication puis

    dconnexion la fin.

    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 Lavantage est quil estpossible de brancher un

    nombre important

    dutilisateurs sur le mme

    serveur. En effet, ils se

    connectent le moins souvent

    et durant la plus courte

    dure possible. De plus, avec

    cet environnement

    dconnect, lapplication

    gagne en performance par la

    disponibilit des ressources

    pour les connexions.

    Les donnes ne sont pastoujours jour, ce qui peut

    aussi entrainer des conflits

    lors des mises jour. Il faut

    aussi penser prvoir du

    code pour savoir ce que va

    faire lutilisateur en cas de

    conflits.

    Il nexiste pas un mode meilleur que lautre, tout dpend de lutilisation que lon compte en

    faire.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    13/47

    13 Base de donnes (ADO.NET)

    14/09/08

    3 Etablir une connexion3.1 Les chanes de connexions

    Dans un mode connect, il faut tout dabord connecter lapplication la base de

    donnes. Nous utiliserons SQL Server 2005 pour la suite. Pour ouvrir cette connexion il faut

    dabord dclarer une variable, ici ce sera connexion :

    VB

    Dim connexion As SqlConnection

    //C#

    SqlConnection connexion

    La proprit ConnectionStringpermet dindiquer les paramtres de connexion. Cela se fait

    sous forme de chane de caractres, tel que par exemple :

    VB

    connexionString = "Data Source=.\SQLServeur;Initial

    Catalog=DotNetFrance;Integrated Security=true;"

    //C#

    connexionString = @"Data Source=.\SQLServeur;Initial

    Catalog=DotNetFrance;Integrated Security=true;";Voici les diffrents paramtres disponibles dans une ConnectionString :

    Paramtre Description

    Connect Timeout Indique le temps dattente de connexion en

    seconde. Ce laps de temps dpass, une

    exception est leve.

    Connection LifeTime Indique la dure de vie dune connexion

    dans un pool, la valeur 0 (zro) correspond linfini.

    Connection Reset Indique si la connexion a t rinitialise lors

    de son retour dans un pool.

    Data Source Indique le nom ou ladresse rseau du

    serveur.

    Initial Catalog Indique le nom de la base de donnes o

    lapplication doit se connecter.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    14/47

    14 Base de donnes (ADO.NET)

    14/09/08

    Integrated Security Indique sil faut un nom et un mot de passe.

    Si la valeur et sur False, un login et password

    seront demands.

    Max Pool Size Indique le nombre maximum de connexion

    dans un pool. Par dfaut, le nombre

    maximum de connexions est 100.

    Min Pool Size Indique le nombre minimum de connexion

    dans un pool.

    Persist Security Info Indique si le nom et le mot de passe est

    visible par la connexion.

    Pwd Indique le mot de passe associ au compte

    SQL Server.

    Pooling Indique si une connexion peut tre sortie

    dun pool.

    User ID Indique le nom du compte SQL Server.

    Afin de vrifier ltat dune connexion, ADO.NET propose lnumration ConnectionState. Il

    possde diffrentes proprits :

    Proprit Description

    Broken Permet de savoir si la connexion est

    interrompue, cette connexion peux se

    fermer puis se rouvrir.

    Closed Permet de savoir si lobjet connexion est

    ferm.

    Connecting Permet de savoir si lobjet connexion est en

    cours de connexion.

    Executing Permet de savoir si une commande est en

    train de sexcuter.

    Fetching Permet de savoir si lobjet connexion est en

    train de rcuprer des donnes.

    Open Permet de savoir si lobjet connexion est

    ouvert.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    15/47

    15 Base de donnes (ADO.NET)

    14/09/08

    Voici, par exemple :

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    16/47

    16 Base de donnes (ADO.NET)

    14/09/08

    3.2 Les pools de connexionsAfin de rduire le cot en ressource engendr par les connexions des bases de

    donnes, lADO.NET propose une technique doptimisation : le pool de connexion. Lorsque

    quune application ouvre une nouvelle connexion, un pool est cr. Les pools permettent de

    stocker toutes les requtes rcurrentes. Chaque fois quun utilisateur ouvre une connexion

    avec la mme ConnectionString quun pool, le dispositif de connexion vrifie sil y a une

    place disponible dans ce pool, si le MaxPoolSize nest pas atteint, la connexion rentre dans

    lensemble. Un pool est effac lorsquune erreur critique est leve.

    Les pools sont paramtrables dans le ConnectionString et une connexion est retire dun

    pool lorsquelle est inactive depuis une certaine dure.

    Voici les mots-cls de connexion de votre pool de connexion :

    Nom Par dfaut Description

    Connection Lifetime 0

    Quand une connexion tente de rejoindre le

    pool, si son temps de connexion dure plus de

    xsecondes (xtant la valeur de la proprit),

    la connexion est stoppe.

    Connection Reset TrueDtermine si la connexion est remise zro

    lors de la cration dun ensemble de

    connexion.

    Enlist True

    Si vous utilisez une connexion dans le cadre

    dune transaction, vous pouvez dfinir ce

    mot-cl sur True.

    Load Balance Timeout 0

    Indique le nombre de secondes dune

    connexion avant quelle soit dtruite de

    lensemble.

    Max Pool Size 100

    Indique le nombre maximum de connexions

    autorises dans un ensemble pour une

    chane de connexion spcifique. En dautres

    termes si votre connexion demande sans

    cesse de se connecter la base de donnes,

    vous pourriez avoir besoin daugmenter

    votre Max Pool Size (par dfaut 100

    connexions autoriss).

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    17/47

    17 Base de donnes (ADO.NET)

    14/09/08

    Min Pool Size 0Dtermine le nombre minimum de

    connexions autoriss.

    Pooling True

    Indique une valeur boolenne si la connexion

    est regroupe (True) ou si elle est ouverte

    chaque demande de connexion.

    En plus des mots-cls permettant de contrler le comportement des Connection Pool, il

    existe des mthodes qui ont des incidences sur un ensemble :

    Nom Object Description

    ClearAllPoolSqlConnection et

    OracleConnection

    Rinitialise toutes les

    Connection Pool.

    ClearPoolSqlConnection et

    OracleConnection

    Rinitialise une Connection

    Poolspcifique.

    ReleaseObjectPoolOleDbConnection et

    Odbcconnection

    Spcifie au pool de

    connexions qu'il peut tre

    dtruit lorsque la dernire

    connexion qu'il contenait a

    t dtruite.

    3.3 DconnexionPour couper la connexion entre lapplication et la base de donnes, il suffit dcrire :

    VB

    nomConnexion.Close()

    //C#

    nomConnexion.Close();

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    18/47

    18 Base de donnes (ADO.NET)

    14/09/08

    4 Mode connect4.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 Commandqui sont les

    suivantes :

    Nom Type de sources de donnes

    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 Permet de dfinir linstruction de requtes

    SQL ou de procdures stockes excuter.

    Li la proprit CommandType.

    CommandTimeout Permet dindiquer le temps en secondes

    avant de mettre fin lexcution de la

    commande.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    19/47

    19 Base de donnes (ADO.NET)

    14/09/08

    CommandType Permet dindiquer ou de spcifier la manire

    dont la proprit CommandTextdoit tre

    excute.

    Connection Permet dtablit une connexion.

    Parameters Cest la collection des paramtres de

    commandes. Lors de lexcution de requtes

    paramtres ou de procdures stockes,

    vous devez ajouter les paramtres objet

    dans la collection.

    Transaction Permet de dfinir la SqlTransaction dans

    laquelle la SqlCommandsexcute.

    Mthodes

    Nom Description

    Cancel Permet de tenter lannulation de lexcution

    dune commande.

    ExecuteNonQuery Permet dexcuter des requtes ou des

    procdures stockes qui ne retournent pas

    de valeurs.

    ExecuteReader Permet dexcuter des commandes et les

    retourne sous forme de tableau de donnes

    (ou des lignes).

    ExecuteScalar Permet dexcuter les requtes ou les

    procdures stockes en retournant une

    valeur unique.

    ExecuteXMLReader Permet de retourner les donnes sous le

    format XML.

    Vous pouvez aussi manipuler des vnements. Voici les deux principaux :

    Evnements Description

    Disposed

    Permet dappeler la dernire mthode avant

    que lobjet ne soit dtruit.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    20/47

    20 Base de donnes (ADO.NET)

    14/09/08

    StatementCompleted (seulement pour

    SqlCommand)

    Se produit lorsque lexcution dune

    instruction se termine.

    4.2 Utiliser des commandesUne fois la connexion tablie, la classe SqlCommandpermet dappeler la mthode

    CreateCommandqui permettra lexcution de commandes SQL.

    Il existe trois mthodes afin de crer une commande :

    Vous pouvez directement utiliser un des constructeurs de la classe SqlCommand. Parcontre cela ncessite lutilisation de deux proprits : CommandTextet Connection.Voici un exemple utilisant cette mthode :

    VB

    Dim commande As SqlCommand = New SqlCommand()commande.Connection = connexioncommande.CommandText = "SELECT * FROM Employe"

    //C#

    SqlCommand commande= newSqlCommand();commande.Connection = connexion;

    commande.CommandText = "SELECT * FROM Employe";

    La deuxime mthode est lutilisation dun constructeur surcharg, voici parexemple :

    VB

    commande = New SqlCommand("SELECT * FROM Employe", connexion)

    //C#

    commande = newSqlCommand("SELECT * FROM Employe", connexion);

    La dernire mthode est dutiliser la mthode CreateCommandde l'objet deconnexion comme dans lexemple ci-dessous :

    VB

    Dim commande As SqlCommand = connexion.CreateCommand()commande.CommandText = "SELECT * FROM Employe"

    //C#

    SqlCommand commande = connexion.CreateCommand();commande.CommandText = "SELECT * FROM Employe";

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    21/47

    21 Base de donnes (ADO.NET)

    14/09/08

    Le fonctionnement pour excuter une procdure stocke est quasiment identique

    lexcution dune requte SQL classique. Il faut que la proprit CommandTextcontienne le

    nom de la procdure, par contre la proprit CommandType doit prendre la valeur

    StoredProcedure au lieu de Text. Lavantage dune procdure stocke est une amlioration

    de la performance car la procdure se trouve prcompile dans le cache du serveur. Voici unexemple qui permet dafficher toutes les informations dun utilisateur de la table Employe :

    VB

    Dim connexion As SqlConnection = New SqlConnection("DataSource=.\SQLServeur;Initial Catalog=DotNetFrance;IntegratedSecurity=True")Dim Command As SqlCommand = connexion.CreateCommand()connexion.Open()

    Dim id AsStringDim requete AsString = "RecupInformation"

    Command.CommandText = requeteCommand.CommandType = CommandType.StoredProcedure

    Console.WriteLine("Quel est l'id de la personne sur laquelle vous voulezles informations ?")id = Console.ReadLine()

    Dim paramIdToKnow As SqlParameter = New SqlParameter("@IdToKnow", id)Command.Parameters.Add(paramIdToKnow)

    Dim lecture As IDataReader = Command.ExecuteReader()

    While (lecture.Read())Console.WriteLine("Id : {0} Nom : {1} Prenom : {2} Role : {3}",lecture("ID"), lecture.GetString(1), lecture.GetString(2),lecture.GetInt32(3))EndWhile

    connexion.Close()connexion.Dispose()

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    22/47

    22 Base de donnes (ADO.NET)

    14/09/08

    //C#

    SqlConnection connexion = newSqlConnection(@"DataSource=.\SQLServeur;Initial Catalog=DotNetFrance;IntegratedSecurity=True");SqlCommand command = connexion.CreateCommand();connexion.Open();

    string id;string requete = "RecupInformation";

    command.CommandText = requete;command.CommandType = CommandType.StoredProcedure;

    Console.WriteLine("Quel est l'id de la personne sur laquelle vous voulezles informations ?");id = Console.ReadLine();

    SqlParameter paramIdToKnow = newSqlParameter("@IdToKnow", id);command.Parameters.Add(paramIdToKnow);

    IDataReader lecture = command.ExecuteReader();

    while (lecture.Read()){

    Console.WriteLine("Id : {0} Nom : {1} Prenom : {2} Role : {3}",lecture["ID"], lecture.GetString(1), lecture.GetString(2),lecture.GetInt32(3));}

    connexion.Close();connexion.Dispose();

    Afin dexcuter une instruction SQL qui renvoie plusieurs valeurs, on peut utiliser la

    mthode ExecuteReader; elle va retourner lobjet Datareaderqui va permettre la lecture des

    donnes. Si linstruction SQL ne doit renvoyer quune valeur unique, on peut utiliser la

    mthode ExecuteScalarqui va la fois soccuper de lexcution et retourner la valeur.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    23/47

    23 Base de donnes (ADO.NET)

    14/09/08

    Voici, par exemple, un code permettant dafficher la base de donnes Dot-Net France :

    VB

    Dim connexion As SqlConnection = New SqlConnection("DataSource=.\SQLServeur;Initial Catalog=DotNetFrance;Integrated

    Security=True")Dim Command As SqlCommand = connexion.CreateCommand()Dim requete AsString = "SELECT e.ID 'ID', e.Nom, e.Prenom, r.Nom FROMEmploye e, Role r WHERE(e.Role = r.ID) "Command.CommandText = requete

    connexion.Open()Dim lire As SqlDataReader = Command.ExecuteReader()

    Console.WriteLine("Lecture du DataReader" + vbNewLine + vbNewLine)' Lit les informations de la base de donnes

    While (lire.Read())

    Console.WriteLine("Id : {0} Nom : {1} Prenom : {2} Role : {3}",lire("ID"), lire.GetString(1), lire.GetString(2), lire.GetString(3))EndWhile' Permet d'afficher

    connexion.Close()connexion.Dispose()

    //C#

    SqlConnection connexion = newSqlConnection(@"DataSource=.\SQLServeur;Initial Catalog=DotNetFrance;Integrated

    Security=True");SqlCommand command = connexion.CreateCommand();string requete = "SELECT e.ID 'ID', e.Nom, e.Prenom, r.Nom FROM Employee, Role r WHERE(e.Role = r.ID) ";command.CommandText = requete;

    connexion.Open();SqlDataReader lire = command.ExecuteReader();// Lit les informations de la base de donnes

    Console.WriteLine("Lecture du DataReader \n\n");

    while (lire.Read()){

    Console.WriteLine("Id : {0} Nom : {1} Prenom : {2} Role : {3}",lire["ID"], lire.GetString(1), lire.GetString(2), lire.GetString(3));

    }// Permet d'afficher

    connexion.Close();connexion.Dispose();

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    24/47

    24 Base de donnes (ADO.NET)

    14/09/08

    Vous devriez obtenir un affichage semblable :

    Vous pouvez galement excuter des commandes qui vous renvoient les donnes au

    format XML. Pour cela vous devez rgler la proprit CommandTextde votre instruction SQL

    au format XML puis faire appel la mthode ExecuteXMLReaderqui retourne un objet

    XmlReader(dont la classe est stocke dans System.Xml). Lorsque vous configurez votre

    commande, vous pouvez utiliser le Query Designerafin de crer et de personnaliser vos

    requtes. Donc vous devez slectionner votre base de donnes dans le Server Explorerpuis

    cliquer sur New Query. Vous ouvrez ainsi le Query Designeret 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

    BeginExecuteNonQueryCommence la version asynchrone de la mthode

    ExecuteNonQuery.

    BeginExecuteReaderCommence la version asynchrone de la mthode

    ExecuteReader.

    BeginExecuteXmlReaderCommence la version asynchrone de la mthode

    ExecuteXmlReader.

    EndExecuteNonQueryAppeler cette mthode aprs lvnement

    StatementCompletedafin dachever lexcution de la

    commande.

    EndExecuteReader

    Appeler cette mthode aprs lvnement

    StatementCompletedafin de renvoyer le DataReaderavec

    les donnes retournes par la commande.

    EndExecuteXmlReader

    Appeler cette mthode aprs lvnement

    StatementCompletedafin de renvoyer leXmlReaderavec

    les donnes retournes par la commande.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    25/47

    25 Base de donnes (ADO.NET)

    14/09/08

    4.3 Les paramtres de commandes SQLUn paramtre peut tre considr comme un type de variable qui permet de

    transmettre des valeurs et des retours entre votre demande et la base de donnes. Comme

    toute variable dans une application, les paramtres sont crs pour contenir un certain type

    de donnes. Les types de donnes des paramtres sont assigns en utilisant les types dfinis

    dans lnumration de lobjet System.Data.SqlDbType. Cette numration contient toute

    une liste des types disponibles dans SQL Server.

    Vous dfinissez un paramtre une requtes SQL (ou une procdure stocke) lorsque vous

    changez les critres de votre requtes rapidement. Par exemple lutilisation typique

    dutilisation dun paramtre est dans la clause WHERE de votre requte SQL. Les

    paramtres vous permettent aussi de contrler la faon dont est entr un utilisateur

    dans une requte.

    Remarque : Pour SQL Server le symbole @ est utilis pour crer des paramtres nomms.

    Le symbole point dinterrogation ? (paramtre anonyme) est utilis dans les autres types de

    base de donnes.

    4.4 Les types de paramtresLa modification des informations contenue dans votre base de donnes est faite par les

    instructions SQL. Il existe quatre types de paramtres :

    - le premier est de type Input, c'est--dire que vous voulez utiliser un paramtre pourenvoyer des donnes la base de donnes.

    - le second est le type Outputqui lui est utilis lorsquon veut rcuprer des donnes.- le troisime est lInputOutputqui 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 valeurassigne.

    4.5 Crer un paramtreParamtrer vos requtes sert aussi les rendre gnriques. Les paramtres servent

    prendre un emplacement dans une requte qui sera plus tard utilis dans votre code.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    26/47

    26 Base de donnes (ADO.NET)

    14/09/08

    La classe SqlParameterpermet de crer des objets de type Sqlparametercontenant : le nom,

    la valeur et la direction dutilisation du paramtre.

    Voici un exemple permettant dajouter un utilisateur dans la base de donnes

    DotNetFrance :

    VB

    Dim connexion As SqlConnection = New SqlConnection("DataSource=.\SQLServeur;Initial Catalog=DotNetFrance;IntegratedSecurity=True")Dim Command As SqlCommand = connexion.CreateCommand()Dim nom, prenom, requete, role AsString

    Console.WriteLine("Entrez les donnes suivantes :" + vbNewLine) Ecrit directement dans la consoleConsole.WriteLine("Nom : ")nom = Console.ReadLine()

    Permet de lire la valeur donneConsole.WriteLine(vbNewLine + "Prenom : ")prenom = Console.ReadLine()Console.WriteLine(vbNewLine + "Role (0 Stagiaire | 1 Manager) : ")role = Console.ReadLine()requete = "INSERT INTO Employe VALUES(@nom, '" + prenom + "'," + role +")"Dim param As SqlParameter = New SqlParameter("@nom", nom) Permet de paramtrer "nom"Command.Parameters.Add(param) Ajoute le paramtre param la collection ParametersCommand.CommandText = requete

    connexion.Open()Dim nbrEnregistrementAffecte AsString =Command.ExecuteNonQuery().ToString()Console.WriteLine(vbNewLine + nom + " " + prenom + " " + role + " a ete

    ajoute.")

    Console.WriteLine("Il y a " + nbrEnregistrementAffecte + "

    enregistrement(s) affecte par la requete")

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    27/47

    27 Base de donnes (ADO.NET)

    14/09/08

    //C#

    SqlConnection connexion = newSqlConnection(@"DataSource=.\SQLServeur;Initial Catalog=DotNetFrance;IntegratedSecurity=True");SqlCommand command = connexion.CreateCommand();string nom, prenom, requete;int role;

    Console.WriteLine("Entrez les donnes suivantes :\n");// Ecrit directement dans la consoleConsole.WriteLine("Nom : ");nom = Console.ReadLine();// Permet de lire la valeur donneConsole.WriteLine("\nPrenom : ");prenom = Console.ReadLine();Console.WriteLine("\nRole (0 Stagiaire | 1 Manager) : ");role = int.Parse(Console.ReadLine());requete = "INSERT INTO Employe VALUES(@nom, '" + prenom + "'," + role +")";SqlParameter param = newSqlParameter("@nom", nom);// Permet de paramtrer "nom"command.Parameters.Add(param);// Ajoute le paramtre param la collection Parameterscommand.CommandText = requete;

    connexion.Open();int nbrEnregistrementAffecte = command.ExecuteNonQuery();Console.WriteLine("\n" + nom + " " + prenom + " " + role + " a eteajoute.");Console.WriteLine("Il y a " + nbrEnregistrementAffecte + "enregistrement(s) affecte par la requete");

    Remarque : Vous pouvez aussi ajouter des paramtres vos Command Object en saisissant

    la mthode GetCostCommand.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    28/47

    28 Base de donnes (ADO.NET)

    14/09/08

    4.6 Les BLOBsLes BLOBs dans une base de donnes ne sont pas de simples donnes de types chaines

    de caractres, ce sont des les types de donnes binaires du type graphiques, photos,

    documents enregistrs en format binaire ou bien des excutables (ils peuvent contenir tous

    les types), par consquence leur utilisation est plus complexe.

    La taille dun BLOB peut dpasser plusieurs Go et par consquence peut nuire aux

    performances au moment dun chargement. En revanche le .NET Framework fournit des

    classes permettant le dplacement de grosses quantits de donnes binaires. Ces classes

    (comme BinaryReaderou BinaryWriter) se trouvent dans lespace de nom System.IO.

    4.7 Le DataReaderLe 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.

    4.8 Copier un grand nombre de donnesPour copier un grand nombre de donnes vers une table de donnes de faon

    performante (c'est--dire sans trop utiliser de ressources et de temps) il existe deux

    applications :

    Le Framework .NET qui propose dans le namespace System.Data.SqlClientlobjet SqlBulkCopy.

    SQL Server qui propose la requte BULK INSERT SQL.Ces solutions permettent dans la majorit des cas de rendre plus performant le transfert.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    29/47

    29 Base de donnes (ADO.NET)

    14/09/08

    4.9 Les transactionsLes transactions permettent de regrouper des commandes SQL dans une mme entit.

    La transaction permettra que si une des commandes choue alors lopration sera arrte et

    la base de donnes retrouvera son tat initial.

    Pour crer une transaction, il suffit dinstancier votre Transactionpuis de lassigner en

    appelant la mthode BeginTransaction la connexion. Voici un exemple de cration dune

    transaction :

    VB

    Cration dune transaction

    Dim transaction AsNew SqlTransaction

    Dfinit la transaction votre connexion

    Transaction = VotreConnexion.BeginTransaction()

    //C#

    Cration dune transaction

    SqlTransaction transaction

    Dfinit la transaction votre connexion

    transaction = VotreConnexion.BeginTransaction() ;

    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.

    Les transactions sont manages au niveau de la connexion. Par consquent nous

    pourrons commencer une transaction en ouvrant une connexion avec une base de donnes

    pour ensuite commencer les transactions en appelant la mthode BeginTransaction issues

    dune instance de la classe SqlTransaction. Puis vous devez dfinir quelle commande

    ncessite une transaction. Enfin la fin du traitement des donnes vous avez la possibilit

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    30/47

    30 Base de donnes (ADO.NET)

    14/09/08

    soit de valider vos transactions grce la mthode Commitsoit de les annuler grce la

    mthode Rollback.

    4.9.1 Niveau disolations des transactions

    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 IsolationLevelassocis lobjet Transaction :

    Nom Description

    ChaosLes modifications en attente de transactions trs isols ne

    peuvent tre crases.

    ReadCommitted

    Les verrouillages partags sont maintenus pendant que les

    donnes sont en lecture pour viter tout dfaut, mais les

    donnes sont modifiables durant la transaction, entrainant une

    lecture non rptable ou des donnes fantme.

    ReadUncommitted

    Il ny a pas de verrouillage entrainant la possibilit de tout

    dfaut de lecture.

    RepeatableRead

    Toutes les donnes utilises dans une requte sont

    verrouilles. Par consquence les lectures ne sont pas

    rptables mais des donnes fantme peuvent exister et

    dautres utilisateurs ne peuvent mettre jour les donnes.

    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

    Rduit le blocage par le stockage de donnes quune seul

    application peut lire pendant quune autre est train de les

    modifier. Cela indique que dune seule transaction vous ne

    pouvez voir les modifications faites dans dautres transactions.

    Unspecified

    Aucun niveau ne peut tre dtermin. Ainsi si le niveau

    disolation est dfinit sur celui-ci alors la transaction excute

    selon le niveau disolation par dfaut du sous-jacent du type de

    base de donnes.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    31/47

    31 Base de donnes (ADO.NET)

    14/09/08

    4.9.2 Les transactions Distribues

    En plus de crer des nouvelles transactions et de dfinir des niveaux disolation de

    celles-ci, vous pouvez configurez votre connexion pour lengager dans une transaction

    distribue. Une transaction distribue est une transaction qui stend sur de nombreuses

    ressources, telles que de multiples bases de donnes SQL.

    Exemple de mise en place dune transaction distribue :

    VB

    VotreConnexion.EnlistTransaction(activeTransaction)

    //C#

    VotreConnexion.EnlistTransaction(activeTransaction) ;

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    32/47

    32 Base de donnes (ADO.NET)

    14/09/08

    5 Mode dconnect5.1 Le DataSet

    Le DataSetest 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 DataSetcontient 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 DataSetsur 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 clforeach, on peut parcourir des DataSetou les requter en Linq.

    La cration dun DataSetpeut 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 DesignerDataSetet lassistant de configuration de DataSource 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 DataSettyp. Ainsi cela gnra le

    code ncessaire pour cette cration.

    Vous pouvez aussi glisser directement un DataSetdepuis la Toolboxsur votre Form(cas pour le WinForm)

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    33/47

    33 Base de donnes (ADO.NET)

    14/09/08

    Il existe deux types de DataSet:

    Typed DataSet: Cela permet de crer une instance dune classe DataSetdj typedans votre projet.

    Untyped Dataset: Cela permet de crer une instance dune classe DataSetnon-typde la classe System.Data.DataSet.

    Voici les lments dun DataSet:

    Objet Description

    DataTable Correspond une table. Contient une collection de DataColumn

    et de DataRow.

    DataColumn Reprsente une colonne de la table.

    DataRow Correspond un enregistrement de la table.

    5.2 Configurer un DataSet5.2.1 Crer un DataSet

    Pour crer un DataSet, il faut en premier lieu les instancier (vous pouvez aussi dfinir

    leur nom) :

    VB

    Dim DotNetFranceDataSet AsNew DataSet()

    //C#

    DataSet DotNetFranceDataSet = newDataSet();

    5.2.2 Ajouter des DataTableAprs avoir cr votre DataSet, vous pouvez lui ajouter des DataTable comme ceci :

    VB

    Dim Employe AsNew DataTable

    Dim Role AsNew DataTable

    DotNetFranceDataSet.Tables.Add(Employe)

    DotNetFranceDataSet.Tables.Add(Role)

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    34/47

    34 Base de donnes (ADO.NET)

    14/09/08

    //C#

    DataTable Employe = newDataTable();DataTable Role = newDataTable();

    DotNetFranceDataSet.Tables.Add(Employe);

    DotNetFranceDataSet.Tables.Add(Role);

    5.2.3 Le DataRelationLobjet DataRelation reprsente le lien entre plusieurs tables. Dans un DataSet, il

    permet la relation entre les colonnes de plusieurs DataTable. Par exemple, nous pouvons lier

    les colonnes ID et Role de nos tables Employe et Role :

    VB

    Dim Employe AsNew DataRelation ("EmployeRole",

    Employe.ParentColumns("Role"), Role.Columns("ID"))

    DotNetFranceDataSet.Relations.Add(Employe)

    //C#

    DataRelation Employe = newDataRelation("EmployeRole",Employe.ParentColumns["Role"], Role.Columns["ID"]);DotNetFranceDataSet.Relations.Add(Employe);

    Ensuite, grce cette relation, vous pouvez naviguer entre les colonnes de vos tables. Le

    DataRowpropose deux mthodes : le GetParentRowet le GetChildRows :

    Mthode Description

    GetParentRows Permet dobtenir les lignes parentes dun

    DataRowattach un DataRelation.

    GetChildRows Permet dobtenir les lignes enfants dun

    DataRowattach un DataRelation.

    Par exemple, nous pouvons afficher les ID de notre prcdente relation EmployeRole :

    VB

    Dim IdCorrespondant As DataRow = ID.GetParentRow("FK_Employe_Role")

    //C#

    DataRow IdCorrespondant = ID.GetParentRow("FK_Employe_Role");

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    35/47

    35 Base de donnes (ADO.NET)

    14/09/08

    5.2.4 Fusionner deux DataSet

    La mthode Merge permet de fusionner deux DataSetentre eux. On prend un DataSet

    source quon fusionne avec un DataSetcibl. Pour des tables identiques, ce sont les donnes

    du DataSetsource qui remplaceront les donnes du DataSetcibl. Lorsquil sagit de deux

    DataSetdiffrents, vous pouvez paramtrer la mthode Merge avec la proprit

    MissingSchemaAction. Voici les diffrentes valeurs de ce paramtre :

    Valeur Description

    Add Permet dajouter les objets contenus dans le

    DataSetsource dans le DataSetcibl.

    AddWithKey Permet dajouter les objets contenus dans le

    DataSetsource dans le DataSetcibl avec

    les cls primaires.

    Error Une exception sera leve si le mappage

    dune colonne dans les DataSetsource et

    cibl est manquante.

    Ignore Toutes les colonnes du DataSetsource

    supplmentaire sont ignores.

    5.2.5 Copier un DataSet

    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

    Dim CopieDuDataSet AsNew DataSetCopieDuDataSet = DataSetDorigine.Copy

    //C#

    DataSet CopieDuDataSet = newDataSet();CopieDuDataSet = DataSetDorigine.Copy();

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    36/47

    36 Base de donnes (ADO.NET)

    14/09/08

    5.3 Configurer une DataTable5.3.1 Crer des colonnes contenant des expressions

    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

    Dim SommeColonne AsNew DataColumn("Somme", GetType(Decimal))SommeColonne.Expression = ("Colonne1 + Colonne2")

    DotNetFranceDataSet.MaTable.Columns.Add(SommeColonne)

    //C#

    DataColumn SommeColonne = newDataColumn("Somme",Type.GetType("decimal"));SommeColonne.Expression = ("Colonne1 + Colonne2");DotNetFranceDataSet.MaTable.Columns.Add(SommeColonne);

    Remarque : Si vous grez des nombres virgules, changez le paramtre Decimalen Double.

    5.3.2 Lincrmentation dans une DataTable

    Lauto-incrmentation est le fait dincrmenter (augmenter) un nombre. On peut

    lincrmenter avec un nombre positif ou un nombre ngatif. Lincrmentation se fait sur une

    colonne. Pour incrmenter, il faut mettre True la propritAutoIncrement. La proprit

    AutoIncrementSeeddfinit le nombre de dpart etAutoIncrementStep dfini le pas de

    lincrmentation (cest celui qui peut tre positif ou ngatif).

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    37/47

    37 Base de donnes (ADO.NET)

    14/09/08

    5.3.3 Les contraintes dans une DataTable

    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 decrer linstance de la classe UniqueConstraintet dassigner la colonne avec la valeur

    unique au constructeur.

    Les cls trangres : Afin dajouter une cl une ou plusieurs colonnes voir plusieurstables 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 Les modifications se font sur toutes les lignes lies par la

    cl.

    None Les modifications ne se font pas sur les lignes lies par la

    cl.

    SetDefault La valeur par dfaut est donne dans les lignes lies.

    SetNull La valeur est modifie par DBNull.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    38/47

    38 Base de donnes (ADO.NET)

    14/09/08

    5.4 Le DataAdapterLobjet DataAdapterpermet de relier un DataSet une base de donnes. En revanche

    le DataAdapterchange 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.

    5.4.1 Crer un DataAdapter

    Pour crer un DataAdapter, il faut tout dabord instancier celui correspondant votre

    fournisseur. Il a besoin dune commande pour fonctionner. Par exemple :

    VB

    Dim DotNetFranceAdapter AsNew SqlDataAdapter("SELECT * FROM Employe",

    connexion)

    //C#

    SqlDataAdapter DotNetFranceAdapter = newSqlDataAdapter("SELECT * FROM

    Employe", connexion);

    5.4.2 Crer des commandes pour un DataAdapter

    Il est possible dajouter plusieurs commandes un DataAdapter. Pour cela, il suffit de

    crer votre commande puis de lajouter votre DataAdapter. Par exemple, voici une

    commande associe un DataAdapterpermettant de modifier le prnom de la table

    Employe :

    VB

    Dim ModifierNom AsNew SqlCommand("UPDATE Employe SET Prenom = 'Jeremie'

    WHERE Prenom='Jeremy'")

    DotNetFranceAdapter.ModifierNom = ModifierNom

    //C#

    SqlCommand ModifierNom = newSqlCommand("UPDATE Employe SET Prenom ='Jeremie' WHERE Prenom='Jeremy'");DotNetFranceAdapter.ModifierNom = ModifierNom;

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    39/47

    39 Base de donnes (ADO.NET)

    14/09/08

    5.4.3 Le MissingMappingAction

    Cette proprit permet de rgler certains conflits entre un DataSetet 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.

    Lnumration MissingMappingAction possde ces valeurs possibles :

    Valeur Description

    Error Permet de lever lexception InvalidOperationException si une

    colonne est manquante.

    Ignore Permet de retourner une valeur NULL si une table ou une

    colonne est manquante.

    Passthrough Permet de crer la colonne et/ou la table manquante.

    5.4.4 Le MissingSchemaAction

    Cette proprit permet aussi de rgler les conflits entre un DataSetet une base de donnes.

    Il permet de spcifier o et comment ajouter des donnes dans des DataTable et

    DataColumnmanquante. Voici les valeurs de lnumration MissingMappingAction :

    Valeur Description

    Add Permet de crer la colonne et/ou la table manquante.

    AddWithKey Permet dajouter les cls ncessaires aux colonnes.

    Error Permet de lever lexception InvalidOperationException si une

    colonne est manquante.

    Ignore Permet dignorer les colonnes en trop.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    40/47

    40 Base de donnes (ADO.NET)

    14/09/08

    5.5 Grer une DataTable5.5.1 Ajouter des donnes

    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

    DotNetFranceDataSet.Tables("Employe").Rows.Add(5, "Bascans", "Jrmy", 1)

    //C#

    DotNetFranceDataSet.Tables["Employe"].Rows.Add(5, "Bascans", "Jrmy", 1);

    5.5.2 Grer des donnes

    Vous pouvez aussi diter ou supprimer des donnes dans votre DataTable comme ceci :

    Langage Modifier Supprimer

    C# MaLigne ["ID"] = "Numero" ; MaLigne.Delete() ;

    VB MaLigne ("ID") = "Numero" MaLigne.Delete

    Le RowStatevous permet de grer le statut dune ligne. Par dfaut, il se trouve sur

    Unchanged. Voici les valeurs possibles de cette numration :

    Valeur Description

    Added Permet la ligne de sajouter dans la collection

    DataRowCollection.

    Deleted Permet de supprimer la ligne en utilisant la mthode Delete de

    DataRow.

    Detached Permet de crer la ligne sans quelle nappartienne la

    collection DataRowCollection.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    41/47

    41 Base de donnes (ADO.NET)

    14/09/08

    Modified Permet de modifier la ligne.

    Unchanged Permet de ne pas modifier la ligne.

    5.5.3 Les vnements dune DataTable

    La DataTable possde ses propres vnements :

    Evnement Description

    ColumnChanged Se dclenche lorsquune valeur a t

    change dans un DataRowdune

    DataColumn.

    ColumnChanging Se dclenche lorsquune valeur est en train

    dtre change dans un DataRowdune

    DataColumn.

    Disposed Est appele lorsque la mthode Dispose est

    appele.

    Initialized Se dclenche aprs que la DataTable soit

    initialise.

    RowChanged Se dclenche lorsquun DataRowa bien t

    modifi.

    RowChanging Se dclenche lorsquun DataRowest en

    modification.

    RowDeleted Se dclenche lorsque quune ligne a t

    supprime.

    RowDeleting Se dclenche lorsque quune ligne est

    entrain dtre supprime.

    TableCleared Se dclenche quand une DataTable a t

    vide.

    TableClearing Se dclenche quand une DataTable se vide.

    TableNewRow Se dclenche lorsquun DataRowest ajout.

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    42/47

    42 Base de donnes (ADO.NET)

    14/09/08

    5.6 Le DataViewUn 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

    Afin de crer un DataView, il suffit de crer linstance de celle-ci et dy placer le nom

    de la DataTable souhaite. Par exemple :

    VB

    Dim MonDataView AsNew DataView(DotNetFranceDataSet.Tables( "Employe"))Dim MonDataView As DataView =

    DotNetFranceDataSet.Tables["Employe"].DefaultView

    //C#

    DataView MonDataView = newDataView(DotNetFranceDataSet.Tables["Employe"]);DataView MonDataView = DotNetFranceDataSet.Tables["Employe"].DefaultView;

    5.6.2 Grer un DataView

    La proprit Sortdu DataViewpermet 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

    MonDataView.Sort = "Nom ASC"

    //C#

    MonDataView.Sort = "Nom ASC";

    Le DataRowViewpermet de modifier les lignes dune table. Par exemple :

    VB

    DataRowView("Nom") = "Jeremie"

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    43/47

    43 Base de donnes (ADO.NET)

    14/09/08

    //C#

    DataRowView("Nom") = "Jeremie";

    Lvnement principal dun DataViewest le ListChanged. Cet vnement se dclenchelorsque quil y a un changement dans une DataTable ou DataRelation reli ce DataView.

    5.7 Exemples5.7.1 Remplissage automatique / Lecture de donnesVB

    Dim requete, connexionString AsStringconnexionString = "Data Source=.\SQLServeur;Initial Catalog=DotNetFrance;IntegratedSecurity=true;"requete = "SELECT * FROM Employe"

    Dim ds As DataSet = New DataSet()Dim da As IDbDataAdapter = New SqlDataAdapter()

    Dim connexion As IDbConnection = New SqlConnection(connexionString)Dim commande As IDbCommand = connexion.CreateCommand()commande.CommandText = requete' On choisit la commande qui sera excut par le DataAdapter et on rempli le

    DataSet

    da.SelectCommand = commandeda.Fill(ds)

    'Affichage du DataSetConsole.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 tiredu DataSet

    ForEach colonne As DataColumn In ds.Tables(0).Columns 'Affichage des noms descolonnes

    Console.Write(colonne.ColumnName + vbTab)Next

    Console.WriteLine(vbNewLine + vbNewLine)

    ForEach ligne As DataRow In ds.Tables(0).Rows 'Afichage des enregistrements

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    44/47

    44 Base de donnes (ADO.NET)

    14/09/08

    //C#

    string requete, connexionString;connexionString = @"Data Source=.\SQLServeur;InitialCatalog=DotNetFrance;Integrated Security=true;";requete = "SELECT * FROM Employe";

    DataSet ds = newDataSet();IDbDataAdapter da = newSqlDataAdapter();

    IDbConnection connexion = newSqlConnection(connexionString);IDbCommand commande = connexion.CreateCommand();commande.CommandText = requete;commande.CommandType = CommandType.Text;

    // On choisit la commande qui sera execut par le DataAdapter et on rempli leDataSetda.SelectCommand = commande;da.Fill(ds);

    //Affichage du DataSetConsole.WriteLine("Nom de la table : {0} | Il possde {1} enregistrement(s)\n\n\n", ds.Tables[0],ds.Tables["Table"].Rows.Count); //On affiche les informationsque lon tire du DataSet

    foreach (DataColumn colonne in ds.Tables[0].Columns) //Affichage des noms descolonnes{

    Console.Write(colonne.ColumnName + "\t");}Console.WriteLine("\n\n");

    foreach (DataRow ligne in ds.Tables[0].Rows) //Afichage des enregistrements{

    foreach (DataColumn colonne in ds.Tables[0].Columns)

    { Console.Write(ligne[colonne.ColumnName] + "\t");}Console.WriteLine("\n");

    }Console.ReadLine();

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    45/47

    45 Base de donnes (ADO.NET)

    14/09/08

    5.7.2 Remplissage manuel du DataSetVB

    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 enregistrementstagiaires.Columns.Add("ID", GetType(Integer) ' l'idstagiaires.Columns.Add("Nom", GetType(String)) ' le nomstagiaires.Columns.Add("Description", GetType(String)) ' description' mthode du dictionnaireDim dnom As Dictionary(OfString, String)= New Dictionary(OfString,

    String)()dnom.Add("Cdric", "Stagiaire")dnom.Add("Christophe", " Stagiaire ") ' pour chaque paire

    d'lments nous allons ajouter des enregistrementsForEach elem As KeyValuePair(OfString, String) In dnom

    stagiaires.Rows.Add(Class1.StagiaireID, elem.Key, elem.Value)

    Next' des listesDim nom() AsString = {"Jrmy", "Cdric"}Dim desc AsString() = {"Manager ", "Manager"} ' s'il y a beaucoup

    de champs pour des raisons de lisibilits il peut etre prfrable' de ranger chaque liste dans un DictionaryFor 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 DataSetds.Tables.Add(stagiaires)' donc nous allons afficher pour prouver le fonctionnement' les donnes dans un terminalForEach row As DataRow In ds.Tables("stagiaires").Rows

    ForEach col As DataColumn In stagiaires.ColumnsConsole.Write(row.Item(col.ColumnName).ToString() + vbTab)

    Next' retour la ligne entre chaque enregistrement.Console.WriteLine()

    NextConsole.ReadLine()

    EndSub

    PublicClass Class1' on cre une valeur id avec acesseur pour l'auto incrementation

    PrivateShared _stagiaireid As Int32 = 0PublicSharedReadOnlyProperty StagiaireID() As Int32

    Get_stagiaireid += 1Return _stagiaireid

    EndGetEndProperty

    EndClassEndModule

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    46/47

    46 Base de donnes (ADO.NET)

    14/09/08

    //C#

    classMainClass{

    publicstaticvoid 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");

    }privatestaticint _stagiaireid = 0;publicstaticint StagiaireID { get { return _stagiaireid++; } }

    publicstaticvoid 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 descriptionstagiaires.Columns.Add("id", typeof(int));stagiaires.Columns.Add("nom ", "text".GetType());stagiaires.Columns.Add("description", typeof(string));// Rangement dans une collection gnriqueDictionary dnom = new Dictionary();dnom.Add("Cdric", "Stagiaire");

    dnom.Add("Christophe", "Stagiaire");

    foreach (KeyValuePair elem in dnom){

    stagiaires.Rows.Add(StagiaireID, elem.Key, elem.Value);}

    // dans des listesstring[] nom = { "Jrmy", "Cdric" };string[] desc = { "Manager", "Manager" };

    for (int i = 0; i < nom.Length; i++){

    stagiaires.Rows.Add(StagiaireID, nom[i], desc[i]);}

    // remplissage brutstagiaires.Rows.Add(StagiaireID, "Paul", "Stagiaire");stagiaires.Rows.Add(StagiaireID, "Quentin", "Stagiaire");

    ds.Tables.Add(stagiaires);

    afficheTable(ds, "stagiaires");}

    }

  • 7/29/2019 ADO.NET - Base de Donnes.pdf

    47/47

    47 Base de donnes (ADO.NET)

    6 ConclusionVous 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.