• Aucun résultat trouvé

donnéesPilote de base de données

6.3 Accès aux données en mode connecté 1 Les bases de données de l'exemple

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 : dos>liste syntaxe : pg dsnArticles dos>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 dos>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)

dos>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 :

' options Option Explicit On Option Strict On ' espaces de noms Imports System Imports System.Data Imports Microsoft.Data.Odbc Imports Microsoft.VisualBasic Module db1

Sub main(ByVal args As String()) ' application console

Accès aux bases de données 162

' dont le nom est passé en paramètre

Const syntaxe As String = "syntaxe : pg dsnArticles"

Const tabArticles As String = "articles" ' la table des articles

' vérification des paramètres

' a -t-on 1 paramètre If args.Length <> 1 Then ' msg d'erreur Console.Error.WriteLine(syntaxe) ' fin Environment.Exit(1) End If ' on récupère le paramètre

Dim dsnArticles As String = args(0) ' la base DSN

' préparation de la connexion à la bd

Dim articlesConn As OdbcConnection = Nothing ' la connexion

Dim myReader As OdbcDataReader = Nothing ' le lecteur de données

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

Try

' chaîne de connexion à la base

Dim connectString As String = "DSN=" + dsnArticles + ";" articlesConn = New OdbcConnection(connectString)

articlesConn.Open()

' exécution d'une commande SQL

Dim sqlText As String = "select * from " + tabArticles Dim myOdbcCommand As New OdbcCommand(sqlText)

myOdbcCommand.Connection = articlesConn myReader = myOdbcCommand.ExecuteReader() ' Exploitation de la table récupérée

' affichage des colonnes

Dim ligne As String = "" Dim i As Integer

For i = 0 To (myReader.FieldCount - 1) - 1 ligne += myReader.GetName(i) + "," Next i

ligne += myReader.GetName(i)

Console.Out.WriteLine((ControlChars.Lf + "".PadLeft(ligne.Length, "-"c) + ControlChars.Lf + ligne + ControlChars.Lf + "".PadLeft(ligne.Length, "-"c) + ControlChars.Lf))

' affichage des données

While myReader.Read()

' exploitation ligne courante

ligne = "" For i = 0 To myReader.FieldCount - 1 ligne += myReader(i).ToString + " " Next i Console.WriteLine(ligne) End While Catch ex As Exception

Console.Error.WriteLine(("Erreur d'exploitation de la base de données " + ex.Message + ")")) Environment.Exit(2) Finally ' fermeture lecteur myReader.Close() ' fermeture connexion articlesConn.Close() End Try End Sub End Module

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.

Imports System.Data

Imports Microsoft.Data.Odbc

Les espaces de noms utilisés par le programme sont dans différents assemblages. On le compile avec l'instruction suivante : dos>vbc /r:microsoft.data.odbc.dll /r:microsoft.visualbasic.dll /r:system.dll /r:system.data.dll db1.vb

6.3.2.1 La phase de connexion

Une connexion ODBC utilise la classe OdbcConnection. Le construct eur de cette classe admet comme paramètre ce qu'on appelle une

Accès aux bases de données 163 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 :

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 :

' préparation de la connexion à la bd

Dim articlesConn As OdbcConnection = Nothing ' la connexion Dim myReader As OdbcDataReader = Nothing ' le lecteur de données Try

' on tente d'accéder à la base de données ' chaîne de connexion à la base

Dim connectString As String = "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 :

' exécution d'une commande SQL

Dim sqlText As String = " select * from " + tabArticles Dim myOdbcCommand As 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 164 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