Dim cnx As New ADODB.Connection ou alors Dim cnx As ADODB.Connection Set cnx = New ADODB.Connection/td> |
'Déclaration de la variable de connexion Dim cnx As ADODB.Connection Set cnx = New ADODB.Connection 'Définition du pilote de connexion cnx.Provider = "Microsoft.Jet.Oledb.3.51" 'Définition de la chaîne de connexion cnx.ConnectionString = "C:\maBase.mdb" 'Ouverture de la base de données cnx.Open |
Le piote 3.51 permet d'accéder à Acces 95 et 97. Pour Access 2000, il faut utiliser la version 4.0.
2.2 Connexion à une base de données SQL Server sans DSN:
'Déclaration de la variable de connexion Dim cnx As ADODB.Connection Set cnx = New ADODB.Connection ... 'Définition de la chaîne de connexion cnx.ConnectionString = "UID=" & NomUtilisateur &";PWD=" & MotDePasse & ";" & "DRIVER={SQL Server};Server=" & NomServeur & ";Database=" & NomBaseDeDonnées & ";" 'Ouverture de la base de données cnx.Open |
Comme vous avez pû le constater, il n'y a pas la ligne cnx.Provider. En effet dans cet exemple le pilote à utiliser est décrit dans la chaîne de connexion : DRIVER={SQL Server}.
2.3 Connexion à une base de données Oracle sans DSN:
'Déclaration de la variable de connexion Dim cnx As ADODB.Connection Set cnx = New ADODB.Connection ... 'Définition de la chaîne de connexion cnx.ConnectionString = "UID=" + NomUtilisateur & ";PWD=" & MotDePasse & ";" & "DRIVER=msdaora;Server=" & NomServeur & ";Database=" & NomBaseDeDonnées & ";" 'Ouverture de la base de données cnx.Open |
Vous avez pû voir des chaînes de connexion avec comme DRIVER {Microsoft
ODBC for Oracle}. Ceci marche mais n'est pas très recommandé.
2.4 Connexion à une base de données avec un DSN:
'Déclaration de la variable de connexion Dim cnx As ADODB.Connection Set cnx = New ADODB.Connection ... 'Définition de la chaîne de connexion cnx.ConnectionString = "DSN=" & NomDuDSN & ";UID=" & NomUtilisateur & ";PWD=" & MotDePasse & ";" 'Ouverture de la base de données cnx.Open |
Dans le cas où il y a le DSN, vous n'avez plus besoin de spécifier l'hôte
sur lequel se trouve la base de données ainsi que le nom de la base de
données.
Pour finir cette partie, voici une petite fonction de connexion avec DSN.
2.5 Quelques informations supplémentaires sur les pilotes:
Liste des pilotes ODBC sans DSN
dBase
Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=chemin\nombd.dbf;
MS Access
Driver={Microsoft Access Driver (*.mdb)};Dbq=chemin\nombd.mdb;Uid=NomUtilisateur;Pwd=MotDePasse;
MS SQL Server
Driver={SQL Server};Server=NomDuServeur;Database=nombd;Uid=NomUtilisateur;Pwd=MotDePasse;
MS Text Drive
Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=chemin\;Extensions=asc,csv,tab,txt;Persist Security Info=False;
MySQL
Driver={mysql}; database=nombd;server=NomDuServeur;uid=NomUtilisateur;pwd=MotDePasse;option=16386;
Oracle
Driver={Microsoft ODBC for Oracle};Server=ServeurOracle.schema;Uid=NomUtilisateur;Pwd=MotDePasse;
Visual Foxpro
Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDB=chemin\nombd.dbc;Exclusive=No;
Liste des pilotes OLEDB
MS Access
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=chemin\nombd.mdb;User Id=NomUtilisateur;Password=MotDePasse;
MS SQL Server
Provider=SQLOLEDB;Data Source=NomServeur;Initial Catalog=nombd;User ID=NomUtilisateur;Password=MotDePasse;
MS SQL Server avec une adresse IP
Provider=SQLOLEDB; Data Source=xx.xx.xx.xx,1433; Network Library=DBMSSOCN; Initial Catalog=dbname;User ID=NomUtilisateur;Password=MotDePasse;
MS Text Driver
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=chemin;Extended Properties='text;FMT=Delimited'"
Oracle
Provider=OraOLEDB.Oracle;Data Source=nombd;User Id=NomUtilisateur;Password=MotDePasse;
Il existe deux objets ADO pour réaliser les requêtes : Command et Recordset. Quelle est la différence ?
L'objet Recordset, comme son nom l'indique, permet de récupérer un ensemble
d'enregistrements. La seule requête SQL permettant de récupérer un jeu
d'enregistrements est le SELECT. Vous pouvez tout aussi bien utiliser cet objet
pour faire des UPDATE, DROP, ALTER, ...
Dans le cas de ces dernières
opérations on utilisera plutôt Command qui fera l'objet du prochain
chapitre.
Je tiens tout de même à spécifier qu'il existe plusieurs façons d'exécuter une requête, mais j'ai fait le choix de vous présenter celle qui me semble la plus propre et la plus claire. Donc ne soyez pas surpris si vous trouvez sur d'autres cours et tutoriaux d'autres façons de faire.
3. Réaliser des requêtes avec l'objet Recordset
Comme pour l'objet Connection vous devez commencer par déclarer une variable de type Recordset.
Dim rst As New ADODB.Recordset |
ou alors
Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset |
Une fois ces lignes de code tappées, vous pouvez exécuter votre requête.
Pour celà vous devez utiliser la méthode Open de l'objet Recordset. Cette
méthode prend en paramètre :
L'ensemble de ces champs sont facultatifs, mais je vous conseille d'au moins passer les deux premiers paramètres à la méthode. Celà rend le code plus clair. Dans les exemples qui vont suivre je n'utiliserai que les deux premiers paramètres. Si vous souhaitez plus d'informations, je vous renvoie sur MSDN qui est très bien documenté.
Voici un petit exemple :
'Déclaration des variables Dim cnx As ADODB.Connection Dim rst As ADODB.Recordset 'Instanciation des variables Set cnx = New ADODB.Connection Set rst = New ADODB.Recordset 'Connexion à la base de données cnx.ConnectionString = "Provider=" & PiloteDaccesAlaBaseDeDonnées & ";DSN=" & NomDuDSN & ";UID=" & NomUtilisateur & ";PWD=" & MotDePasse & ";" cnx.Open 'Exécution de la requête rst.Open "SELECT nom, prenom, adresse FROM Client", cnx |
Une fois le Open exécuté, l'ensemble des enregistrements retournés par le SELECT se trouvent dans l'objet Recordset, ici rst.
Pour accéder à ces enregistrements vous devez utiliser le champ Field. Chaque champ Field contient une colonne. Dans notre cas nous en avons 3 numérotées de 0 à 2. Vous avez donc deux solutions pour accéder à un champ. Prenons l'exemple du champ prenom. Vous faites rst.Fields(1) ou bien rst.Fields("prenom"). Vous avez pû voir certainement du code avec rst(1) ou bien rst("prenom"), c'est la même chose. Et oui les développeurs sont un peu faignants dès qu'il s'agit de tapper du code ;o)
Accèder à un champ c'est bien, mais pouvoir naviguer dans l'ensemble des enregistrements c'est mieux. Pour celà, il existent des méthodes permettant de le faire :
Il y a deux propriétés de l'objet Recordset à connaître pour la navigation qui sont:
Voici un exemple de boucle permettant de parcourir un jeu d'enregistrement et d'afficher le résultat.
While Not(rst.EOF) MsgBox rst("nom") & " " & rst("prenom") & " habite au " & rst("adresse") & "." rst.MoveNext Wend |
Il arrive que certaines fois, il y est un problème avec l'objet Recordset
et il ne pointe pas au début de l'enregistrement. Donc pour remédier à ce
problème vous pouvez tappez les lignes suivantes après avoir effectué le
Open.
rst.MoveLast rst.MoveFirst |
Une fois que vous n'utilisez plus le Recordset, pensez à le fermer avec la méthode Close.
rst.Close |
Il existe une autre propriété qui peut être intéressante qui est RecordCount.
Elle vous permet de savoir le nombre d'enregistrements stockés dans l'objet
Recordset.
Voici un petit exemple de fonction pouvant exécuter tout type de requêtes via un Recordset.
Après avoir vu l'objet Recordset, nous allons voir l'objet Command et lien entre entre ces deux objets.
4. Réaliser des requêtes avec l'objet Command
Comme pour les autres objets, vous devez commencer par déclarer une variable de type Command.
Dim rst As New ADODB.Command |
ou alors
Dim rst As ADODB.Command Set rst = New ADODB.Command |
L'objet Command est un peu plus complexe que le Recordset quoique.
L'avantage de l'objet Command par rapport à l'objet Recordset est de pouvoir
facilement paramétrer les requêtes mêmes les SELECT.
Pour pouvoir utiliser des requêtes paramétrables il faut utiliser le symbôle ? dans la requête SQL puis rajouter un objet Parameter à l'objet Command.
Pour être plus clair voici un exemple :
'Déclaration des variables Dim cnx As ADODB.Connection Dim cmd As ADODB.Command Dim prm1 As ADODB.Parameter Dim rst As ADODB.Recordset 'Instanciation des variables Set cnx = New ADODB.Connection Set cmd = New ADODB.Command Set prm1 = New ADODB.Parameter Set rst = New ADODB.Recordset 'Connexion à la base de données cnx.ConnectionString = "Provider=" & PiloteDaccesAlaBaseDeDonnées & ";DSN=" & NomDuDSN & ";UID=" & NomUtilisateur & ";PWD=" & MotDePasse & ";" cnx.Open 'Préparation de l'objet Command cmd.CommandText = "SELECT * FROM Client WHERE nom = ?" 'Préparation du paramètre prm1.Name = "nom" 'Nom du champ correspondant prm.Type = adVarChar 'Type du champ prm.Direction = adInput 'Type de paramètre : Entrée, Sortie, Entrée/Sortie prm.Size = 40 'Taille maximale du champ prm.Value = "Dupond" 'Valeur du paramètre 'Exécution de la requête Set rst = cmd.Execute |
Comme vous avez pû le remarquer, j'ai utilisé un Recordset dans cet exemple. Voici une façon de récupérer les enregistrements retournés par un SELECT. L'objet Recordset n'est nécessaire que dans le cas d'un SELECT. Dans les autres cas vous pouvez tapper juste cmd.Execute. La méthode Execute de l'objet Command peut prendre trois paramètres qui sont falcutatifs:
La propriété CommandText contient la requête à exécuter. Ca peut être une requête standard comme une requête de modification de l'architecture d'une table ou de la base de données.
Pour conclure ce chapitre, j'ai juste une dernière chose à vous signaler. Dans le cas où vous utilisez les objets Parameter faites attention à faire les Append de vos paramètres dans le même ordre que les ? dans la requête SQL.