• Aucun résultat trouvé

Utilisation d'un pilote ODBC

Dans le document Télécharger cours de C# en pdf (Page 148-151)

donnéesPilote de base de données

6.3.2 Utilisation d'un pilote ODBC

Dans une application utilisant une base de données en mode connecté, on trouvera généralement les étapes suivantes : 1. Connexion à la base de données

2. Émissions de requêtes SQL vers la base

3. Réception et traitement des résultats de ces requêtes 4. Fermeture de la connexion

Les étapes 2 et 3 sont réalisées de façon répétée, la fermeture de connexion n’ayant lieu qu’à la fin de l’exploitation de la base. C’est un schéma relativement classique dont vous avez peut-être l’habitude si vous avez exploité une base de données de façon interactive. Ces étapes sont les mêmes que la base soit utilisée au travers d'un pilote ODBC ou d'un pilote OLE DB. Nous présentons ci-dessous un exemple avec les classes .NET de gestion des sources de données ODBC. Le programme s'appelle liste et admet comme paramètre le nom DSN d'une source de données ODBC ayant une table ARTICLES. Il affiche alors le contenu de cette table : E:\data\serge\MSNET\c#\adonet\5>liste syntaxe : pg dsnArticles E:\data\serge\MSNET\c#\adonet\5>liste articles-access --- code,nom,prix,stock_actuel,stock_minimum --- a300 vélo 2500 10 5 b300 pompe 56 62 45 c300 arc 3500 10 20 d300 flèches - lot de 6 780 12 20 e300 combinaison de plongée 2800 34 7 f300 bouteilles d'oxygène 800 10 5 E:\data\serge\MSNET\c#\adonet\5>liste mysql-artices

Erreur d'exploitation de la base de données (ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified)

E:\data\serge\MSNET\c#\adonet\5>liste mysql-articles --- code,nom,prix,stock_actuel,stock_minimum --- a300 vélo 2500 10 5 b300 pompe 56 62 45 c300 arc 3500 10 20 d300 flèches - lot de 6 780 12 20 e300 combinaison de plongée 2800 34 7 f300 bouteilles d'oxygène 800 10 5

Sur les résultats ci-dessus, nous voyons que le programme a listé aussi bien le contenu de la base ACCESS que de la base MySQL. Etudions maintenant le code de ce programme :

using System;

using System.Data;

using Microsoft.Data.Odbc;

class listArticles {

static void Main(string[] args){ // application console

// affiche le contenu d'une table ARRTICLES d'une base DSN

// dont le nom est passé en paramètre

Accès aux bases de données 149

const string tabArticles="articles"; // la table des articles

// vérification des paramètres

// a-t-on 2 paramètres if(args.Length!=1){ // msg d'erreur Console.Error.WriteLine(syntaxe); // fin Environment.Exit(1); }//if // on récupère le paramètre

string dsnArticles=args[0]; // la base DSN

// préparation de la connexion à la bd

OdbcConnection articlesConn=null; // la connexion

OdbcDataReader myReader=null; // le lecteur de données

try{

// on tente d'accéder à la base de données

// chaîne de connexion à la base

string connectString="DSN="+dsnArticles+";"; articlesConn = new OdbcConnection(connectString); articlesConn.Open();

// exécution d'une commande SQL

string sqlText = "select * from " + tabArticles; OdbcCommand myOdbcCommand = new OdbcCommand(sqlText); myOdbcCommand.Connection = articlesConn;

myReader=myOdbcCommand.ExecuteReader(); // Exploitation de la table récupérée

// affichage des colonnes

string ligne=""; int i; for(i=0;i<myReader.FieldCount-1;i++){ ligne+=myReader.GetName(i)+","; }//for ligne+=myReader.GetName(i); Console.Out.WriteLine("\n"+"".PadLeft(ligne.Length,'-')+"\n"+ligne+"\n"+"".PadLeft(ligne.Length,'-')+"\n");

// affichage des données

while (myReader.Read()) { // exploitation ligne courante

ligne=""; for(i=0;i<myReader.FieldCount;i++){ ligne+=myReader[i]+" "; } Console.WriteLine(ligne); }//while }//try

catch(Exception ex){

Console.Error.WriteLine("Erreur d'exploitation de la base de données "+ex.Message+")"); Environment.Exit(2); }//catch finally{ try{ // fermeture lecteur myReader.Close(); // fermeture connexion articlesConn.Close(); }catch{} }//finally // fin Environment.Exit(0); }//main }//classe

Les classes de gestion des sources ODBC se trouvent dans l'espace de noms Microsoft.Data.Odbc qu'on doit donc importer. Par ailleurs, un certain nombre de classes se trouve dans l'espace de noms System.Data.

using System.Data;

using Microsoft.Data.Odbc;

L'espace de noms Microsoft.Data.Odbc se trouve dans "l'assembly" microsoft.data.odbc.dll. Aussi pour compiler le programme précédent écrit-on :

csc /r:microsoft.data.odbc.dll liste.cs

6.3.2.1 La phase de connexion

Une connexion ODBC utilise la classe OdbcConnection. Le constructeur de cette classe admet comme paramètre ce qu'on appelle une chaîne de connexion. Celle-ci est une chaîne de caractères qui définit tous les paramètres nécessaires pour que la connexion à la base de données puisse se faire. Ces paramètres peuvent être très nombreux et donc la chaîne complexe. La chaîne a la forme "param1=valeur1;param2=valeur2;...;paramj=valeurj;".Voici quelques paramètres paramj possibles :

Accès aux bases de données 150 uid nom d'un utilisateur qui va accéder à la base de données

password mot de passe de cet utilisateur dsn nom DSN de la base si elle en a un data source nom de la base de données accédée ...

Si on définit une source de données comme source de données ODBC à l'aide de l'administrateur de sources de données ODBC, ces paramètres ont déjà été donnés et enregistrés. Il suffit alors de passer le paramètre DSN qui donne le nom DSN de la source de données. C'est ce qui est fait ici :

OdbcConnection articlesConn=null; // la connexion

try{

// on tente d'accéder à la base de données

// chaîne de connexion à la base

string connectString="DSN="+dsnArticles+";"; articlesConn = new OdbcConnection(connectString); articlesConn.Open();

Une fois l'objet OdbcConnection construit, on ouvre la connexion avec la méthode Open. Cette ouverture peut échouer comme toute autre opération sur la base. C'est pourquoi l'ensemble du code d'accès à la base est-il dans un try-catch. Une fois la connexion établie, on peut émettre des requêtes SQL sur la base.

6.3.2.2 Émettre des requêtes SQL

Pour émettre des requêtes SQL, il nous faut un objet Command, ici plus exactement un objet OdbcCommand puisque nous utilisons une source de données ODBC. La classe OdbcCommand a plusieurs constructeurs :

OdbcCommand() : crée un objet Command vide. Il faudra pour l'utiliser préciser ultérieurement diverses propriétés : o CommandText : le texte de la requête SQL à exécuter

o Connection : l'objet OdbcConnection représentant la connexion à la base de données sur laquelle la requête sera faite

o CommandType : le type de la requête SQL. Il y a trois valeurs possibles

1. CommandType.Text : la propriété CommandText contient le texte d'une requête SQL (valeur par défaut) 2. CommandType.StoredProcedure : la propriété CommandText contient le nom d'une procédure stockée dans la

base

3. CommandType.TableDirect : la propriété CommandText contient le nom d'une table T. Equivalent à select * from T. N'existe que pour les pilotes OLE DB.

OdbcCommand(string sqlText) : le paramètre sqlText sera affecté à la propriété CommandText. C'est le texte de la requête SQL à exécuter. La connexion devra être précisée dans la propriété Connection.

OdbcCommand(string sqlText, OdbcConnection connexion) : le paramètre sqlText sera affecté à la propriété CommandText et le paramètre connexion à la propriété Connection.

Pour émettre la requête SQL, on dispose de deux méthodes :

OdbcdataReader ExecuteReader() : envoie la requête SELECT de CommandText à la connexion Connection et construit un objet OdbcDataReader permettant l'accès à toutes les lignes de la table résultat du select

int ExecuteNOnQuery() : envoie la requête de mise à jour (INSERT, UPDATE, DELETE) de CommandText à la connexion Connection et rend le nombre de lignes affectées par cette mise à jour.

Dans notre exemple, après avoir ouvert la connexion à la base, nous émettons une requête SQL SELECT pour avoir le contenu de la table ARTICLES :

const string tabArticles="articles"; // la table des articles

OdbcDataReader myReader=null; // le lecteur de données

// exécution d'une commande SQL

string sqlText = "select * from " + tabArticles; OdbcCommand myOdbcCommand = new OdbcCommand(sqlText); myOdbcCommand.Connection = articlesConn;

myReader=myOdbcCommand.ExecuteReader();

Une requête d’interrogation est classiquement une requête du type : select col1, col2,... from table1, table2,...

where condition

order by expression ...

Accès aux bases de données 151 Seuls les mots clés de la première ligne sont obligatoires, les autres sont facultatifs. Il existe d’autres mots clés non présentés ici. 1. Une jointure est faite avec toutes les tables qui sont derrière le mot clé from

2. Seules les colonnes qui sont derrière le mot clé select sont conservées

Dans le document Télécharger cours de C# en pdf (Page 148-151)