Vous êtes sur la page 1sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS)

Introduction ADO.NET en C#
ADO.NET est un ensemble de composants prsents de base dans le framework .NET permettant laccs et la gestion de donnes situes sur une base de donnes relationnelle (SQL Server, Oracle, MySQL, Access, etc) ou non (fichiers textes, annuaires, messagerie, Excel, etc) Les classes ADO.NET peuvent tre divises en 2 parties. Les classes permettant de se connecter la source de donnes et les classes utilises pour grer les donnes. La connexion la source de donnes 1) Choix d'un fournisseur de donnes .NET : Data Provider Pour pouvoir faire appel aux classes proposes par ADO .Net il est ncessaire d'inclure une rfrence l'espace de noms correspondant. Vous pouvez soit inclure l'espace System.Data soit inclure des classes de cet espace comme System.Data.OleDb ou System.Data.SqlClient ; tout dpend de la source de donnes utilise. //Inclusion d'un namespace using System.Data; using System.Data.SqlClient; Plusieurs espaces de noms sont disponibles avec ADO .Net parmi lesquels : Espace de nom
System.Data.SqlClient

API Description Prefix

Sql Fournisseur de donnes spcifiques pour SQLServer V7 ou suprieure OleDb Propose la gestion de sources de donnes accdes via un driver System.Data.OleDb OleDb (MySQL, Oracle, SQL Server, Access, Excel, etc.) System.Data.Odbc Odbc Propose la gestion de sources de donnes accdes via un driver Odbc Oracle Propose un accs des sources de donnes Oracle (v8.1.7 ou System.Data.OracleClient suprieure) Xml Propose des classes permettant d'accder la fonctionnalit XML System.Data.XML sous SQL Server 2000 ou suprieur Bdp Propose des classes pour des types de donnes spcifiques Interbase, System.Data.Borland IBM DB2 et Oracle.r

Les 4 fournisseurs de donnes inclus dans le framework .NET :


SQL Server Provider : pour SQL Server 7.0 et plus). OLE DB provider : pour toutes les bases de donnes disposant dun pilote OLE DB (Object Linking and Embedding). Oracle provider : pour Oracle (version 8i et plus). ODBC provider : pour toutes les sources de donnes qui ont un pliote ODBC (Open DataBase Connectivity).

Introduction ADO.NET en C#.doc

Page 1 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS)

Note : ODBC est une suite de pilotes permettant la communication avec la pulpart des SGBD (Systme de Gestion de Base de Donnes) du march comme MySQL, Oracle, DB2, PostgreSQL, etc

Il ne faut pas oubli de rajouter ces namespaces, System.Data qui contient les classes essentielles au fonctionnement dADO.NET. Le modle objet ADO.NET

Regardons de plus prs chacun de ces objets.


Objet Description Connection Ouvre une connexion vers une source de donnes spcifique Command Excute une commande sur une source de donnes (SELECT, INSERT, UPDATE, DELETE, etc.) Lit un flux de donnes partir d'une source de donnes en mode connect. Le mode d'accs est en DataReader lecture seule avec un curseur en avant seulement. Reprsente un ensemble de donnes en mode dconnect. Il peut tre constitu de plusieurs tables DataSet ainsi que des relations et contraintes existant entre elles. DataAdapter Remplit un DataSet et rpercute les mises jour dans la source de donnes.

Introduction ADO.NET en C#.doc

Page 2 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS)

Dclaration dun Data Provider pour SQL Server : 2) Dclaration des namespaces

1 using System.Data 2 using System.Data.SqlClient

3) Cration de la connexion

1 SqlConnection connexion = new SqlConnection(); connexion.ConnectionString = @"Data Source=localhost\SQLEXPRESS;Initial 2 Catalog=Northwind;Integrated Security=SSPI";

@ : chane de caractres verbatim (vite les \\). On construit donc la connexion avec la ConnectionString qui indique le serveur de base de donnes (localhost\SQLEXPRESS), la base de donnes (Northwind) et la manire de sauthentifier sur le serveur (SSPI : login utilisateur Windows).

Paramtres ConnectionString Description Data Source Identifie le serveur. (localhost ou nom_machine.nom_domaine, ou adresse IP). Initial Catalog Nom de la base de donnes. Integrated Security SSPI pour tablir la connexion avec la connexion de l'utilisateur Windows User ID Nom de login utilisateur sur le serveur de base de donnes. Password Mot de pass du login utilisateur sur la base de donnes..

Exemple avec login + mot de passe :


1 SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;User ID=Phil;Password=iris");

Note : Lexemple ci-dessus utilise le Data Provider de SQL Server. Pour les autres Data Providers, il suffit de remplacer SqlConnection par OracleConnecion, OleDbConnection ou OdbcConnection. Le mme principe sapplique pour les commandes qui suivront dans cet article. 3) Utiliser un objet xxxConnection (xxx : Sql ou Oracle ou OleDb)

Le but dun objet xxxConnection est dtablir une connexion avec une base de donnes. Chronologie des diverses oprations sur un objet xxxConnection : a) Crer (instancier) un objet xxxConnection. b) Ouvrir la connexion via la mthode open. c) Transmettre lobjet connection un autre objet ADO.NET (xxxCommand, etc.). d) Effectuer une opration spcifique (SELECT, etc.) avec cet autre objet ADO.NET. e) Fermer la connexion via la mthode close de lobjet xxxConnction.

Introduction ADO.NET en C#.doc

Page 3 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS)

4) Exemple objet xxxConnection


using System; using System.Data; using System.Data.SqlClient; /// <summary> /// Mise en oeuvre dun objet xxxConnection /// sur une base SQL Server /// </summary> class SqlConnectionDemo { static void Main() { // a. Instancie un objet xxxConnection SqlConnection conn = new SqlConnection( "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI"); SqlDataReader rdr = null; try { // b. Ouvre la connexion conn.Open(); // c. Transmet lobjet connection un objet ADO.NET ici xxxCommand SqlCommand cmd = new SqlCommand("select * from Customers", conn); // // d. Effectue une operation spcifique, ici SELECT // et retourne le rsultat dans un objet xxxDataReader rdr = cmd.ExecuteReader(); // Affiche la colonne CustomerID de chaque enregistrement while (rdr.Read()) { Console.WriteLine(rdr[0]); } } finally { // ferme lobjet xxxDataReader if (rdr != null) { rdr.Close(); } // d. ferme la connexion if (conn != null) { conn.Close(); } } } }

Introduction ADO.NET en C#.doc

Page 4 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS)

La gestion des donnes Lun des avantages dADO.NET est sa gnricit. Peu importe la source de donnes, le conteneur qui accueillera les donnes sera le mme, le DataSet. Pour faire une analogie avec le C# de base, un DataSet est en quelque sorte un tableau (array), mais spcialement adapt pour accueillir des donnes venant dune source de donnes relationnelle. ADO.NET peut fonctionner de 2 manires diffrentes. En mode connect (Direct Data Access), le programme se connecte la base de donnes et fait un certain nombre doprations (SELECT, INSERT, UPDATE, etc), puis la connexion est ferme. Aucune donne nest donc stocke en mmoire sur le client. En mode dconnect, le programme se connecte la base de donnes durant un temps trs bref pour rapatrier les donnes en mmoire dans un objet DataSet. La connexion est ensuite interrompue. Une fois les oprations (INSERT, DELETE, etc) ralises sur le DataSet, le programme se connecte nouveau la base de donnes et sauvegarde les changements. Quel mode choisir ? Lutilisation du mode connect est recommande pour les sites web puisque le cycle de vie dun programme est totalement diffrent par rapport une application de bureau. Dans une page web, le cycle de vie du programme nest que de quelques secondes, les donnes nont donc pas besoin dtre stockes en mmoire. Concernant les applications lourdes, le mode dconnect est utile lorsquil y a de nombreux traitements faire sur les donnes avant de les modifier dans la base de donnes. 1. Le mode Connect (Direct Data Access) a. La commande SELECT
01 // Connexion la base de donnes 02 SqlConnection connexion = new SqlConnection(); connexion.ConnectionString = @"Data Source=localhost\SQLEXPRESS;Initial 03 Catalog=Northwind;Integrated Security=SSPI"; 05 // Requte SQL 06 SqlCommand selectCommand = new SqlCommand(); 07 selectCommand.Connection = connexion; // Connexion instancie auparavant 08 selectCommand.CommandText = "SELECT ContactName FROM Customers"; 10 SqlDataReader reader; // Contiendra les donnes 12 try 13 { 14 connexion.Open(); // Ouverture de la connexion 15 reader = selectCommand.ExecuteReader(); // Excution de la requte SQL 17 18 19 20 while (reader.Read()) { // Affichage des donnes Console.WriteLine(reader["ContactName"]);

Introduction ADO.NET en C#.doc

Page 5 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS) 21 22 23 24 25 26 27 28 29 30 31 32 33 } catch (Exception ex) { // Affiche des erreurs Console.WriteLine(ex.Message); } finally { // Fermeture de la connexion la base de donnes connexion.Close(); } } reader.Close();

Dtails du code : Premirement, il faut dclarer la connexion la base de donnes, puis dfinir la requte excuter. On dclare un xxxDataReader qui contiendra nos donnes une fois la commande SQL excute. La suite du code est imbriqu dans un bloc try/catch/finally afin de grer les ventuelles erreurs qui pourraient survenir. La connexion la base de donnes est ouverte et la requte excute. La boucle while permet de parcourir tous les enregistrements afin de les afficher dans la console. A la fin de lopration, on ferme le xxxDataReader ainsi que la connexion la base de donnes. Le bloc finally permet de fermer la connexion la base de donnes dans tous les cas (succs de la requte ou erreur).

Par dfaut, un xxxDataReader charge une ligne entire en mmoire chaque appel de la mthode Read(). Il est possible d'accder aux valeurs de colonnes : soit par leurs noms, soit par leurs rfrences ordinales.

Une solution plus performante est propose permettant d'accder aux valeurs dans leurs types de donnes natifs (GetInt32, GetDouble, GetString .).Par exemple si la premire colonne de la ligne indice par 0 est de type int, alors il est possible de la rcuprer l'aide de la mthode GetInt32 de l'objet xxxDataReader. int iColonne; iColonne = reader.GetInt32(0) ;

Introduction ADO.NET en C#.doc

Page 6 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS)

Pour augmenter les performances, il est parfois ncessaire de soumettre plusieurs requtes la fois. L'objet xxxDataReader rpond ce besoin avec la mthode NextResult() permettant de passer d'un jeu d'enregistrement un autre.
// Exemple d'extraction de donnes avec l'objet DataReader
using System; using System.Data.SqlClient; using System.IO; namespace ExempleAdoNetCSharp { public class CommandeSQL { public static void Main() { string strConnexion = "Data Source=localhost; Integrated Security=SSPI;" + "Initial Catalog=Northwind"; string strRequete = "SELECT CategoryID, CategoryName FROM Categories;" + "SELECT EmployeeID, LastName FROM Employees"; try { SqlConnection oConnection = new SqlConnection(strConnexion); SqlCommand oCommand = new SqlCommand(strRequete,oConnection); oConnection.Open(); SqlDataReader oReader = oCommand.ExecuteReader(); do { Console.WriteLine("\t{0}\t{1}", oReader.GetName(0), oReader.GetName(1)); while (oReader.Read()) { Console.WriteLine("\t{0}\t{1}", oReader.GetInt32(0), oReader.GetString(1)); } }while (oReader.NextResult()); oReader.Close(); oConnection.Close(); } catch (Exception e) { Console.WriteLine("L'erreur suivante a t rencontre :" + e.Message); } } } }

Introduction ADO.NET en C#.doc

Page 7 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS)

b. Les commandes INSERT, UPDATE et DELETE Le principe est le mme, lexception du DataReader qui nest plus utile et de la mthode permettant dexcuter la requte : ExecuteReader() qui devient ExecuteNonQuery() puisque la requte ne renvoie que le nombre de lignes modifies.
01 //Connexion la base de donnes 02 SqlConnection connexion = new SqlConnection(); 03 04 05 //Requte SQL SqlCommand updateCommand = new SqlCommand("UPDATE Customers SET 06 ContactName = 'Aymeric Lagier' WHERE CustomerID = 'ALFKI'"); 07 updateCommand.Connection = connexion; 08 09 int lignesModifiees = 0; 10 try { 11 12 13 connexion.Open(); lignesModifiees = updateCommand.ExecuteNonQuery(); // Excution de la requte SQL connexion.ConnectionString = @"Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI";

Console.WriteLine("{0} ligne(s) modifie(s)", lignesModifiees.ToString()); 14 } 15 catch (Exception ex) 16 { 17 // Affiche des erreurs 18 Console.WriteLine(ex.Message); 19 } 20 finally 21 { 22 // Fermeture de la connexion la base de donnes 23 connexion.Close(); 24 }

c. Le processus est identique pour le INSERT et le DELETE. d. Excuter une commande qui ne retourne quune seule valeur : Il faut excuter la mthode ExecuteScalar() de lobjet xxxCommand . ExecuteScalar() renvoie sous la forme dun objet, la premire colonne de la premire ligne.

// 1. Instancie un objet xxxCommand SqlCommand cmd = new SqlCommand("select count(*) from Categories", conn);

Introduction ADO.NET en C#.doc

Page 8 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS) // 2. Excute la mthode ExecuteScalar() de lobjet xxxCommand int count = (int)cmd.ExecuteScalar();

La protection des donnes dans les requtes Dans la requte ci-dessus, ALFKI est inscrit en dur dans la requte, cela ne pause donc pas de problme. Premier problme :Si maintenant le CustomerID est une valeur entre par lutilisateur du programme. Si lutilisateur entre la valeur ALFKI, le programme affichera une erreur. Deuxime problme, les injections SQL. Lutilisateur du programme peut dlibrment entrer des paramtres spciaux qui dtourneront la requte de son but initial. Pour contrer ce type de problme, ADO.NET met en place les requtes paramtres :

Requte normale :
1 SqlCommand requete = new SqlCommand("SELECT * FROM Customers WHERE CustomerID = 'ALFKI'");

Requte paramtre :
1 2 SqlCommand requete = new SqlCommand("SELECT * FROM Customers WHERE CustomerID = @CustomerID"); requete.Parameters.AddWithValue("@CustomerID", myVar); // myVar contient une chaine entre par l'utilisateur

De cette manire un utilisateur peut entrer nimporte quelle chaine de caractres dans myVar, il ny aura pas de problme dinjection SQL ni de chaine invalide. Ce processus fonctionne galement pour le mode dconnect expliqu ci-dessous.

Introduction ADO.NET en C#.doc

Page 9 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS)

2. Le mode Deconnect (Direct Data Access) a. La commande SELECT Pour le mode dconnect le processus est diffrent. Le programme tablit une connexion avec la base de donnes, rcupre les donnes et referme immdiatement la connexion. Les oprations sur les donnes (affichage dans la console) ne se font quune fois la connexion ferme.

Les diverses commandes (SELECT, UPDATE, INSERT, DELETE, etc.) sur la base de donnes se ralisent via un objet DataAdapter. Le rsultat des commandes est transmis dans un objet DataSet.

01 // Connexion la base de donnes 02 SqlConnection connexion = new SqlConnection(); 03 04 05 // Requte SQL 06 SqlCommand selectCommand = new SqlCommand(); 07 selectCommand.Connection = connexion; // Connexion instancie auparavant 08 selectCommand.CommandText = "SELECT * FROM Customers"; 09 10 SqlDataAdapter adapter = new SqlDataAdapter(selectCommand); // Permet de lire les donnes connexion.ConnectionString = @"Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI";

11 DataSet data = new DataSet(); // Contiendra les donnes 12 13 try 14 { 15 adapter.Fill(data, "Customers"); // Rcupre les donnes 16 17 foreach (DataRow row in data.Tables["Customers"].Rows) 18 { // Affichage dans la console 19 Console.WriteLine(row["ContactName"]);
Introduction ADO.NET en C#.doc Page 10 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS) 20 21 22 23 24 25 26 } } catch (Exception ex) { // Affiche des erreurs Console.WriteLine(ex.Message); }

Dtails du code : Comme pour le mode connect, la connexion la base de donnes et la requte SQL sont dclares. A la place du SqlDataReader, le SqlDataAdapter et le DataSet sont dclars. Le SqlDataAdapter va permettre au programme de rcuprer les donnes qui seront stockes dans le DataSet. Une fois les donnes enregistres en mmoire, la connexion la base de donnes est interrompue. Aprs la fermeture de la connexion, le programme peut traiter les donnes (affichage sur la console) contenues en mmoire. Les commandes INSERT, UPDATE, DELETE Pour les requtes INSERT, UPDATE et DELETE, le processus est le mme. Cest--dire se connecter la base de donnes pendant un trs court instant afin de charger la table qui nous intresse en mmoire pour ensuite travailler dessus.
01 // Connexion la base de donnes 02 SqlConnection connexion = new SqlConnection(); 03 04 05 // Requte SQL (SELECT) 06 SqlCommand selectCommand = new SqlCommand(); selectCommand.CommandText = "SELECT City, Country FROM Customers WHERE Country = 'UK'"; 08 selectCommand.Connection = connexion; 07 09 10 //Requte SQL (UPDATE) 11 SqlCommand updateCommand = new SqlCommand(); updateCommand.CommandText = "UPDATE Customers SET City = @City WHERE 12 Country = @Country"; 13 updateCommand.Connection = connexion; 14 15 // Paramtres 16 updateCommand.Parameters.Add("@City", SqlDbType.NVarChar, 100, "City"); 17 18 19 SqlDataAdapter adapter = new SqlDataAdapter(); // Permet de lire les donnes 20 adapter.SelectCommand = selectCommand; // Dfinition la requte SELECT 21 adapter.UpdateCommand = updateCommand; // Dfinition la requte UPDATE 22 updateCommand.Parameters.Add("@Country", SqlDbType.NVarChar, 100, "Country"); connexion.ConnectionString = @"Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI";

Introduction ADO.NET en C#.doc

Page 11 sur 12

Informatique et Rseaux pour l'Industrie et les Services techniques (IRIS) 23 DataSet data = new DataSet(); // Contiendra les donnes 24 25 try 26 { 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 int lignesModifiees = 0; // Nombre de lignes modifies 42 43 44 Console.WriteLine("{0} ligne(s) modifie(s)", lignesModifiees); lignesModifiees = adapter.Update(data.Tables["Customers"]); // Modification dans la base de donnes adapter.Fill(data, "Customers"); // Rcupre les donnes } catch (Exception ex) { // Affiche des erreurs Console.WriteLine(ex.Message); } // Modification du champ "City" foreach (DataRow row in data.Tables["Customers"].Rows) { row["City"] = "London"; }

Dtails du code : Comme dans la requte SELECT, la connexion et la requte SELECT sont dfinies. Petite nouveaut, la dfinition dune commande UPDATE en plus de la commande SELECT ainsi que la dclaration de paramtres correspondants aux champs de la requte UPDATE. Aprs le stockage des donnes dans la mmoire, la modification des donnes peut soprer. Une fois les modifications ralises, la mthode Update() de DataAdapter prend en paramtre la DataTable modifie et envoie les donnes dans la base de donnes.

Introduction ADO.NET en C#.doc

Page 12 sur 12

Vous aimerez peut-être aussi