Visual Basic et les Bases de Données (Résumé)
Communication avec les bases de données
Afin d’établir la communication entre les applications et les bases de données, les langages de programmation mettent à la disposition du programmeur, différents outils. VB est un langage qui offre plusieurs outils simples mais efficaces dans le but de faciliter la programmation et l’utilisation de telles liaisons.
Chaque type de base de données est associé à un «fournisseur», c’est-à-dire un logiciel qui répond aux requêtes qui lui sont soumises en traitant la structure et le contenu de la base. Il existe différents «fournisseurs» d’accès aux bases de données. La liaison avec une base de données de type Access se fait à l’aide du moteur de recherche Microsoft Jet OLE DB Provider qui gère les bases Access. Ceci n’est pas laissé au choix de l’usager car le type de connexion et le langage de requêtes dépendent du type de base qu’on utilise. Ainsi, les fichiers Access 2003 (version 11) utilisent la version «Jet 4.0» alors que les bases de Access 97 (version 8) utilisent la version 3.51 du «Jet».
Pour établir des connections avec des bases de données, VB nous offre une large variété de contrôles graphiques ainsi que des classes d’objets non graphiques. Certains de ces contrôles ont été créés spécifiquement pour gérer ces liaisons. D’autres sont des contrôles que vous connaissez déjà et qui contiennent simplement des propriétés qui facilitent la liaison avec les données qui proviennent d’une base de données.
DAO, ADO et ADO.NET
Les versions 5 et antérieures de VB utilisaient des outils de connexion rassemblés sous le vocable de DAO (Data Access Objects) alors que la version 6 offrait des outils plus performants regroupés utilisant la technologie «OleDb» et regroupés sous le vocable ADO (ActiveX Data Objects). VB.NET ne supporte plus le DAO mais continue de supporter le ADO pour fins de continuité. Mais l’accent pour les nouvelles applications est mis sur une version mise à jour (améliorée) de ADO : les outils ADO.NET qui peuvent gérer les types de bases les plus variées, incluant même des fichiers texte, Excel, Serveurs SQL, pages Web, intranets, banques d’images, etc.
Microsoft recommande donc d’utiliser le modèle ADO.NET puisque les outils ADO seront abandonnés éventuellement. Ceci dit, toute la structure de ces objets est bicéphale : la partie «OleDb» pour la plupart des fournisseurs de données actuels et la partie SQLClient spécialisée pour la gestion des bases fournies par la version 7 (et ultérieure) du serveur SQL de Microsoft.
Tous les outils de traitement des données sont contenus dans l’espace de nom «System.Data» qui apparaît par défaut dans les références de départ. Pour accéder aux outils «OleDb», il suffit de mentionner au début d’un module : Imports System.Data.OleDb
Classes OleDb
L’ensemble de la technologie OLE DB, intégrée au FrameWork.NET, permet au programmeur de créer des commandes qui sont indépendantes des bases de données utilisées en passant par les différents objets intermédiaires qui servent alors d’interface. On change de base ? On ajuste les interfaces et on n’a pas à modifier le programme.
Classe OleDbConnection
Un objet de cette classe possède une propriété fondamentale de type «String», la «ConnectionString» qui décrit à la fois le type de liaison (le moteur de recherche et le fichier ou base à ouvrir). Supposons que la variable «String» contient un texte adéquat, alors on peut écrire
Dim UneConn As OleDbConnection
UneConn = New OleDbConnection
UneConn.ConnectionString = UneChaine
UneConn.Open() ‘ Méthode qui «ouvre» la connexion.
ou, plus brièvement, en utilisant le constructeur «New»
Dim UneConn As OleDbConnection = New OleDbConnection(UneChaine) UneConn.Open() ‘ Méthode qui «ouvre» la connexion.
qui ouvrira alors la connexion. En cas d’erreur dans la chaîne de correction, il y aura interruption du programme avec un message de VB.
À partir de ce moment, on peut utiliser deux ou trois classes d’objets pour, ou bien lire les données de la base, ou bien les modifier et les mettre à jour.
Après la lecture des données, on peut bien sûr fermer la connexion avec
UneConn.Close()
Propriété ConnectionString
Si on ne connaît pas le libellé de la chaîne de connexion adéquate, on peut utiliser un outil développé en VB6 pour la définir facilement : le fichier «XXX.udl». Un fichier de type «Universal Data Link» contient une chaîne de connexion qui peut être modifiée par un éditeur «Assistant des liaisons de données.
On peut créer une liaison en suivant ces étapes :
1. On crée (bouton droit de la souris) un «Nouveau» / «Document texte» qui portera le nom «Nouveau document texte.txt».
2. On renomme le fichier, «UnNom.udl» pour en faire un fichier de liaison vide.
3. On double-clique sur le fichier pour lancer l’éditeur de liaison de données.
4. Dans la boîte de dialogue, deux onglets définissent le moteur de recherche (onglet «Fournisseur» et le fichier lui-même (onglet Connection».
5. Selon le type de base, les autres onglets serviront à définir l’environnement de l’accès, comme le mot de passe, les permissions partagées, etc. Dans le cas d’une simple base Access, les deux premiers onglets peuvent suffire.
6. Dans l’onglet «Fournisseur», on sélectionne «Microsoft Jet xx OLE DB Provider».
7. Dans l’onglet «Connexion», on peut taper le nom de la base ou bien naviguer sur l’ordinateur (bouton […]) pour localiser la base. Si on désire que le fichier soit en adressage relatif, il faut supprimer le chemin pour ne laisser que le nom.
8. Après avoir fermé l’application, il suffit d’ouvrir le fichier avec WordPad, NotePad ou tout autre éditeur de texte et vous y trouverez la chaîne de connexion qu’il suffira de «Copier/Coller» dans votre programme VB :
[OleDb]
; Everything after this line is an OLE DB initstring Provider=Microsoft.Jet.OleDb.4.0;Data Source=BaseTP4.mdb;Persist Security Info=False
Vous noterez que le nom du fichier peut varier d’une application à l’autre. C’est pourquoi on peut séparer la chaîne en trois sections : le nom de la base, la partie qui le précède et la partie qui le suit. On peut alors reconstituer la chaîne en concaténant les trois parties avant de l’utiliser.
Classe OleDbCommand
Une base de données, par définition, contient de nombreuses données de sorte qu’une «interrogation» consiste à soumettre une «requête» spécifiant les informations désirées. Le langage «standard» d’interrogation des bases de données remonte aux années 70 et continue de dominer le «marché» des SGBD (système de gestion de bases de données). Il s’agit du SQL (Structured Query Language ou Langage de requêtes structuré).
Une requête SQL est une chaîne de caractères (ex. «SELECT * FROM XXX» où XXX est le nom d’une table de la base voir plus haut).
Si on présume que la chaîne «UneReqSQL» contient une requête valide en fonction de la base de données visée par la commande, un objet de la classe «OleDbCommand» peut associer cette requête SQL à un objet «OleDbConnection comme suit :
Dim UneCommande As OleDbCommand
UneCommande = New OleDbCommand
UneCommande.Connection = UneConn
UneCommande.CommandText = UneReqSQL
ou, plus brièvement, en utilisant le constructeur «New»
Dim UneCommande As New OleDbCommand(UneReqSQL, UneConn)
Une fois que la commande est définie (requête plus connexion), on doit appeler une méthode (parmi plusieurs) permettant de «lancer» (exécuter) cette requête en vue de recevoir les résultats demandés.
Classe OleDbDataReader
L’objet de classe «OleDbDataReader» est une interface vers les données permettant d’accéder séquentiellement aux données obtenues à partir de l’objet précédent, de classe OleDbCommand. Il s’utilise avec une requête dont l’effet est de ramener un jeu d’enregistrements, c’est-à-dire une séquence de lignes d’une table dont les colonnes sont les champs de la base de données. On l’obtient comme suit :
Dim UnDataReader As OleDbDataReader UnDataReader = UneCommande.ExecuteReader()
L’objet «DataReader» fonctionne tout à fait comme un objet de classe «StreamReader» : il possède une méthode booléenne «Read()» et chaque appel à cette méthode place le prochain enregistrement dans une variable cachée (de type Collection) à laquelle nous donne accès la propriété publique «Item(index)».
Par exemple, supposons que la requête
«SELECT CodePerm, Nom, Intra, Final FROM IFT1175 WHERE [Num DEPT] = 12» placée dans l’objet «UneCommande» ci haut ait pour effet de ramener le bloc d’enregis-trement suivant de la base de données reliée, soit trois enregistrements des quatre champs «CodePerm», «Nom», «Intra» et «Final».
Alors la séquence d’énoncés suivante ouvrira une connexion à la base de données puis, dans une boucle de trois itérations, affichera le nom et la moyenne des deux examens dans une boîte de message. Notez que la propriété «Item» étant la propriété de défaut, l’expression «UnDataReader(3) équivaut à UnDataReader.Item(3) Dim UneChaineSQL As String = « SELECT CodePerm, Nom, Intra, Final » _ & « FROM IFT1175 WHERE [Num DEPT] = 12 » Dim UneChaineConn As String = _ « Provider=Microsoft.Jet.OleDb.4.0; » _ & « Data Source=BaseTP4.mdb; » _ & « Persist Security Info=False »
Dim UneConn As OleDbConnection = New OleDbConnection(UneChaine)
UneConn.Open() ‘ Méthode qui «ouvre» la connexion.
Dim UneCommande As New OleDbCommand(UneChaineSQL, UneChaineConn)
Dim UnDataReader As OleDbDataReader
UnDataReader = UneCommande.ExecuteReader()
Dim UnMess As String, UneMoy As Single
Do While UnDataReader.Read() ‘ sous-entendu = True
UnMess = UnDataReader.Item(« Nom ») & » a une moyenne de : »
UneMoy = (UnDataReader(2) + UnDataReader.Item(3)) / 2
‘ équivaut à UnDataReader(« Intra ») et à UnDataReader(« Final ») UnMess = UnMess & UneMoy.ToString
MsgBox(UnMess)
Loop
UnDataReader.Close()
UneConn.Close()