IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)


Mis à jour le 18/12/2002

Par Sébastien Curutchet

Objet Connection Sommaire Objet Command

Droit de diffusion et d'utilisation:
Tous les documents ou partie de document ainsi que le code sont libres d'accès, mais ne peuvent pas être diffusés sur d'autres sites HTTP, FTP ou autres, sans mon accord.
L'ensemble de mon code mis à votre diposition est libre d'utilisation tant qu'il ne sert pas à la réalisation d'applications payantes. Je demande juste aux personnes incluant mon code dans leurs applications d'y laisser le commentaire mis en entête.


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 :

  • la requête
  • la connexion sur laquelle vous souhaitez exécuter la requête
  • le type du curseur (je vous renvoie à des cours de SGBD)
  • le type de blocage
  • le type de requête

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 :

  • MoveFirst : sélectionne le premier enregistrement
  • MoveLast : sélectionne le dernier enregistrement
  • MoveNext : sélectionne l'enregistrement suivant
  • MovePrevious : sélectionne l'enregistrement précédent

Il y a deux propriétés de l'objet Recordset à connaître pour la navigation qui sont:

  • BOF (Begin Of File) : est à vrai si l'objet Recordset pointe sur le début d'enregistrement
  • EOF (End Of File) : est à vrai si l'objet Recorset pointe sur la fin de l'enregistrement

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.

'============================================================================='
' FUNCTION : ExecSQL(...)
' DESCRIPTION : Execute une requête SQL
' PARAMS : * query : Requête à exécuter
'          * rst : Variable permettant de stocker les enregistrements
'============================================================================='

Public Function ExecSQL(query As String, ByRef rst As ADODB.Recordset, ByRef cnx As ADODB.Connection) As Boolean

  'Initialisation du RecordSet
  If rst.State <> adStateClosed Then rst.Close

  'Ouvre une transaction pour ne pas à avoir à réaliser de commit en fin de traitement
  ADOCnx.BeginTrans

  'Positionne le curseur côté client
  rst.CursorLocation = adUseClient
  'Vérifie que la connexion passée est bonne
  Set rst.ActiveConnection = cnx On Error GoTo ErrHandle
  'Exécute la requête
  rst.Open query, ADOCnx
  'Valide la transaction
  ADOCnx.CommitTrans
  ExecSQL = True
  Exit Function


ErrHandle:
  ExecSQL = False
  MsgBox
"ADOManager.ExecSQL:ErrHandle" & vbCr & vbCr & err.Description, vbCritical
End Function
Objet Connection Sommaire Objet Command

Documents réalisés par Sébastien Curutchet