Partager via


Appel de SQLSetPos

Dans ODBC 2.x, le pointeur vers le tableau d’état de ligne était un argument de SQLExtendedFetch. Le tableau d’état de ligne a été mis à jour ultérieurement par un appel à SQLSetPos. Certains pilotes s’appuient sur le fait que ce tableau ne change pas entre SQLExtendedFetch et SQLSetPos. Dans ODBC 3.x, le pointeur vers le tableau d’état est un champ de descripteur. Par conséquent, l’application peut facilement la modifier pour qu’elle pointe vers un autre tableau. Cela peut être un problème quand une application ODBC 3.x fonctionne avec un pilote ODBC 2.x , mais appelle SQLSetStmtAttr pour définir le pointeur d’état du tableau et appelle SQLFetchScroll pour extraire des données. Le Gestionnaire de pilotes le mappe sous la forme d’une séquence d’appels à SQLExtendedFetch. Dans le code suivant, une erreur est normalement générée lorsque le Gestionnaire de pilotes mappe le deuxième appel SQLSetStmtAttr lors de l’utilisation d’un pilote ODBC 2.x :

SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, rgfRowStatus, 0);  
SQLFetchScroll(hstmt, fFetchType, iRow);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, rgfRowStat1, 0);  
SQLSetPos(hstmt, iRow, fOption, fLock);  

L’erreur serait générée s’il n’y avait aucun moyen de modifier le pointeur d’état de ligne dans ODBC 2.x entre les appels à SQLExtendedFetch. Au lieu de cela, le Gestionnaire de pilotes effectue les étapes suivantes lors de l’utilisation d’un pilote ODBC 2.x :

  1. Initialise un indicateur du Gestionnaire de pilotes interne fSetPosError sur TRUE.

  2. Lorsqu’une application appelle SQLFetchScroll, le Gestionnaire de pilotes définit fSetPosError sur FALSE.

  3. Lorsque l’application appelle SQLSetStmtAttr pour définir SQL_ATTR_ROW_STATUS_PTR, le Gestionnaire de pilotes définit fSetPosError égal àTRUE.

  4. Lorsque l’application appelle SQLSetPos, avec fSetPosError égal à TRUE, le Gestionnaire de pilotes déclenche SQL_ERROR avec SQLSTATE HY011 (l’attribut ne peut pas être défini maintenant) pour indiquer que l’application a tenté d’appeler SQLSetPos après avoir modifié le pointeur d’état de ligne, mais avant d’appeler SQLFetchScroll.