I. Introduction▲
ADO offre un grand nombre d'options lors de l'ouverture d'un recordset. Type de curseur, type de verrouillage, curseur côté serveur ou côté client.
En fonction du fournisseur de données, toutes ces options ne sont pas supportées.
Cela peut se traduire par une erreur d'exécution ou par un recordset dont les fonctionnalités ne correspondent pas à celles choisies lors de l'ouverture.
En effet, si le fournisseur de données ne supporte le type de curseur demandé il ouvrira un recordset avec un curseur d'un autre type. De ce fait les fonctionnalités du curseur obtenu ne sont pas forcément celles que l'on attendait.
J'ai donc réalisé un petit programme de test pour déterminer les options valides et les fonctionnalités du recordset ouvert.
II. Principe du test▲
Création d'une connexion ADO faisant référence au fournisseur de données.▲
Microsoft.Jet.OLEDB.4.0 pour Access
Dim
oConn As
ADODB.Connection
, oRS As
ADODB.Recordset
Set
oConn =
New
ADODB.Connection
oConn.ConnectionString
=
"Provider=Microsoft.Jet.OLEDB.4.0;"
&
_
"Data Source="
&
CurrentProject.FullName
&
";"
oConn.Open
SQLOLEDB pour SQL Serveur
Dim
oConn As
ADODB.Connection
, oRS As
ADODB.Recordset
Set
oConn =
New
ADODB.Connection
oConn.ConnectionString
=
"Provider=SQLOLEDB;DATA SOURCE=NomDuServeur;"
&
_
"INITIAL CATALOG=NomBDD;"
&
_
"INTEGRATED SECURITY=SSPI;"
oConn.Open
Ouverture d'un recordset ADO avec différents types de curseur, de verrouillage, d'option.▲
Curseur côté Serveur
Set
oRS =
New
ADODB.Recordset
oRS.CursorLocation
=
adUseServer
Curseur côté Client
Set
oRS =
New
ADODB.Recordset
oRS.CursorLocation
=
adUseClient
Ouverture
oRS.Open
SCE, oConn, CursorType, LockType, Option
SCE peut être un nom de table, un nom de requête (de Vue pour SQL Serveur), une instruction SQL SELECT, une procédure stockée (SQL serveur).
Dans tous les cas, le jeu d'enregistrements peut être mis à jour (Ajout, Modification, Suppression).
La table possède une clé primaire. La requête (ou la Vue SQL Serveur) est une requête de sélection sur la table avec clé primaire.
La procédure stockée et l'instruction SQL ont le même code SQL que la requête.
CursorType pourra être une des constantes ADO adOpenForwardOnly, adOpenKeyset, adOpenDynamic, adOpenStatic
LockType pourra être une des constantes ADO adLockReadOnly, adLockPessimistic, adLockOptimistic, adLockBatchOptimistic
Option pourra être une des constantes ADO adCmdText, adCmdTable, adCmdTableDirect, adCmdStoredProc
Vérification des fonctionnalités du recordset si il a pu être ouvert▲
- A l'aide de la méthode Supports
- Lecture des propriétés RecordCount, AbsolutePosition
Si la valeur est -1 cette fonctionnalité n'est pas supportée - Lecture des propriétés CursorType, LockType
Permet de vérifier si le recordset obtenu est conforme à celui qui a été demandé
Combinaisons non testées.▲
Certains type de curseur/verrouillage ne sont pas possibles.
- Le verrouillage adLockPessimistic n'existe pas pour un curseur côté client.
- Le verrouillage adLockBatchOptimistic n'existe pas côté serveur.
III. Résultats pour Access▲
Ouverture d'une table par son nom▲
SCE est un nom de table.
Côté Serveur
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenForwardOnly | adLockReadOnly | adCmdTable | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTable | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTable | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTable | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTable |
Côté Client
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenStatic | adLockReadOnly | adCmdTable | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTable | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTable | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTableDirect |
Ouverture d'une requête par son nom▲
SCE est un nom de requête.
Côté Serveur
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenForwardOnly | adLockReadOnly | adCmdTable | |||||||||||
adOpenForwardOnly | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTable | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTable | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTable | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTable | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect |
Côté Client
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenStatic | adLockReadOnly | adCmdTable | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTable | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTable | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTableDirect |
Ouverture d'une instruction SQL SELECT▲
SCE est une instruction SQL SELECT.
Côté Serveur
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenForwardOnly | adLockReadOnly | adCmdText | |||||||||||
adOpenForwardOnly | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdText | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdText | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdText | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockReadOnly | adCmdText | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect |
Côté Client
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenStatic | adLockReadOnly | adCmdText | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenStatic | adLockOptimistic | adCmdText | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdText | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTableDirect |
IV. Résultats pour SQL Serveur▲
Ouverture d'une table par son nom▲
SCE est un nom de table.
Côté Serveur
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenForwardOnly | adLockReadOnly | adCmdTable | |||||||||||
adOpenForwardOnly | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenForwardOnly | adLockPessimistic | adCmdTable | |||||||||||
adOpenForwardOnly | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenForwardOnly | adLockOptimistic | adCmdTable | |||||||||||
adOpenForwardOnly | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTable | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTable | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTable | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenDynamic | adLockReadOnly | adCmdTable | |||||||||||
adOpenDynamic | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenDynamic | adLockPessimistic | adCmdTable | |||||||||||
adOpenDynamic | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenDynamic | adLockOptimistic | adCmdTable | |||||||||||
adOpenDynamic | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTable | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect |
Côté Client
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenStatic | adLockReadOnly | adCmdTable | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTable | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTable | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTableDirect |
Ouverture d'une Vue par son nom▲
SCE est un nom de Vue.
Côté Serveur
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenForwardOnly | adLockReadOnly | adCmdTable | |||||||||||
adOpenForwardOnly | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenForwardOnly | adLockPessimistic | adCmdTable | |||||||||||
adOpenForwardOnly | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenForwardOnly | adLockOptimistic | adCmdTable | |||||||||||
adOpenForwardOnly | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTable | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTable | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTable | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenDynamic | adLockReadOnly | adCmdTable | |||||||||||
adOpenDynamic | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenDynamic | adLockPessimistic | adCmdTable | |||||||||||
adOpenDynamic | adLockPessimistic | adCmdTableDirect | |||||||||||
adOpenDynamic | adLockOptimistic | adCmdTable | |||||||||||
adOpenDynamic | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTable | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect |
Côté Client
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenStatic | adLockReadOnly | adCmdTable | |||||||||||
adOpenStatic | adLockReadOnly | adCmdTableDirect | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTable | |||||||||||
adOpenStatic | adLockOptimistic | adCmdTableDirect | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTable | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdTableDirect |
Ouverture d'une procédure stockée par son nom▲
SCE est un nom de procédure stockée
Côté Serveur
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move >Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenForwardOnly | adLockReadOnly | adCmdText | |||||||||||
adOpenForwardOnly | adLockReadOnly | adCmdStoredProc |
Côté Client
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenStatic | adLockReadOnly | adCmdText | |||||||||||
adOpenStatic | adLockReadOnly | adCmdStoredProc | |||||||||||
adOpenStatic | adLockOptimistic | adCmdText | |||||||||||
adOpenStatic | adLockOptimistic | adCmdStoredProc | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdText | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdStoredProc |
Ouverture d'une instruction SQL SELECT▲
SCE est une instruction SQL SELECT
Côté Serveur
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenForwardOnly | adLockReadOnly | adCmdText | |||||||||||
adOpenForwardOnly | adLockPessimistic | adCmdText | |||||||||||
adOpenForwardOnly | adLockOptimistic | adCmdText | |||||||||||
adOpenKeyset | adLockReadOnly | adCmdText | |||||||||||
adOpenKeyset | adLockPessimistic | adCmdText | |||||||||||
adOpenKeyset | adLockOptimistic | adCmdText | |||||||||||
adOpenDynamic | adLockReadOnly | adCmdText | |||||||||||
adOpenDynamic | adLockPessimistic | adCmdText | |||||||||||
adOpenDynamic | adLockOptimistic | adCmdText | |||||||||||
adOpenStatic | adLockReadOnly | adCmdText |
Côté Client
CursorType | LockType | Option | Update AddNew Delete | Find | Index Seek | Move Previous | RecCount | AbsPos | BookMark | UpdateBatch | Approx Position | HoldRecords | Resync |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
adOpenStatic | adLockReadOnly | adCmdText | |||||||||||
adOpenStatic | adLockOptimistic | adCmdText | |||||||||||
adOpenStatic | adLockBatchOptimistic | adCmdText |
V. Conclusion▲
On constate au travers des différents tableaux qu'il y a bien des différences entre les fournisseurs de données (Access et SQL Serveur) et que toutes les fonctionnalités du modèle ADO ne sont pas supportées.
Par exemple :
- un seul type de curseur côté client.
- pas de curseur dynamique côté serveur pour Access.
Pour de plus amples informations sur ADO je vous invite à lire ce document : Le Recordset ADOLe Recordset ADO par J-M Rabilloud de J-M Rabilloud.
Remerciements▲
Dolphy35 pour son aide et ses encouragements.
RideKick pour son aimable relecture.
Nono40 pour son excellent outil de création d'article et developpez.com pour leur hébergement.