Construction d'instructions SQL pour les curseurs
Le pilote ODBC SQL Server Native Client utilise des curseurs côté serveur pour implémenter les fonctionnalités de curseur définies dans la spécification ODBC. Une application ODBC contrôle le comportement du curseur en utilisant SQLSetStmtAttr pour définir différents attributs d'instructions. Voici les attributs et leurs valeurs par défaut.
Attribut |
Par défaut |
---|---|
SQL_ATTR_CONCURRENCY |
SQL_CONCUR_READ_ONLY |
SQL_ATTR_CURSOR_TYPE |
SQL_CURSOR_FORWARD_ONLY |
SQL_ATTR_CURSOR_SCROLLABLE |
SQL_NONSCROLLABLE |
SQL_ATTR_CURSOR_SENSITIVITY |
SQL_UNSPECIFIED |
SQL_ATTR_ROW_ARRAY_SIZE |
1 |
Lorsque ces options sont définies à leurs valeurs par défaut au moment où une instruction SQL est exécutée, le pilote ODBC SQL Server Native Client n'utilise pas de curseur côté serveur pour implémenter le jeu de résultats ; au lieu de cela, il utilise un jeu de résultats par défaut. Si l'une de ces options n'est pas à sa valeur par défaut au moment où une instruction SQL est exécutée, le pilote ODBC SQL Server Native Client tente d'utiliser un curseur côté serveur pour implémenter le jeu de résultats.
Les jeux de résultats par défaut prennent en charge toutes les instructions Transact-SQL. Il n'y a pas de restrictions concernant les types d'instructions SQL qui peuvent être exécutés lors de l'utilisation d'un jeu de résultats par défaut.
Les curseurs côté serveur ne prennent pas en charge toutes les instructions Transact-SQL. Les curseurs côté serveur ne prennent pas en charge les instructions SQL qui génèrent plusieurs jeux de résultats.
Les types d'instructions suivants ne sont pas pris en charge par les curseurs côté serveur :
Lots
Les instructions SQL construites à partir de plusieurs instructions SQL SELECT individuelles, par exemple :
SELECT * FROM Authors; SELECT * FROM Titles
Procédures stockées avec plusieurs instructions SELECT
Instructions SQL qui exécutent une procédure stockée contenant plusieurs instructions SELECT. Cela inclut les instructions SELECT qui remplissent des paramètres ou des variables.
Mots clés
Instructions SQL contenant les mots clés FOR BROWSE ou INTO.
Dans SQL Server, si une instruction SQL qui remplit l'une de ces conditions est exécutée avec un curseur côté serveur, celui-ci est converti implicitement en un jeu de résultats par défaut. Une fois que SQLExecDirect ou SQLExecute a retourné SQL_SUCCESS_WITH_INFO, les attributs de curseur sont redéfinis à leurs paramètres par défaut.
Les instructions SQL qui n'appartiennent à aucune des catégories précitées peuvent être exécutées avec tout paramètre d'attribut d'instruction ; elles fonctionnent aussi bien avec un jeu de résultats par défaut qu'avec un curseur côté serveur.
Erreurs
Dans SQL Server 7.0 et versions ultérieures, toute tentative d'exécution d'une instruction qui produit plusieurs jeux de résultats génère SQL_SUCCESS_WITH INFO et le message suivant :
SqlState: 01S02"
pfNative: 0
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]
Cursor type changed."
Les applications ODBC qui reçoivent ce message peuvent appeler SQLGetStmtAttr pour déterminer les paramètres de curseur actuels.
Toute tentative d'exécution d'une procédure avec plusieurs instructions SELECT lors de l'utilisation de curseurs côté serveur génère l'erreur suivante :
SqlState: 42000
pfNative: 16937
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
A server cursor is not allowed on a stored procedure
with more than one SELECT statement in it. Use a
default result set or client cursor.
Toute tentative d'exécution d'un lot avec plusieurs instructions SELECT lors de l'utilisation de curseurs côté serveur génère l'erreur suivante :
SqlState: 42000
pfNative: 16938
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
sp_cursoropen. The statement parameter can only
be a single SELECT statement or a single stored
procedure.
Les applications ODBC qui reçoivent ces erreurs doivent réinitialiser tous les attributs d'instructions de curseur à leurs valeurs par défaut avant d'essayer d'exécuter l'instruction.