SQLFetchScroll, fonction

Conformité
Version introduite : Conformité aux normes ODBC 3.0 : ISO 92

Résumé
SQLFetchScroll récupère l’ensemble de lignes spécifié de données à partir du jeu de résultats et retourne des données pour toutes les colonnes liées. Les ensembles de lignes peuvent être spécifiés à une position absolue ou relative ou par signet.

Lorsque vous utilisez un pilote ODBC 2.x, le Gestionnaire de pilotes mappe cette fonction à SQLExtendedFetch. Pour plus d’informations, consultez Fonctions de remplacement de mappage pour la compatibilité descendante des applications.

Syntaxe

  
SQLRETURN SQLFetchScroll(  
      SQLHSTMT      StatementHandle,  
      SQLSMALLINT   FetchOrientation,  
      SQLLEN        FetchOffset);  

Arguments

StatementHandle
[Entrée] Handle d’instruction.

FetchOrientation
[Entrée]

Type de récupération :

SQL_FETCH_NEXT

SQL_FETCH_PRIOR

SQL_FETCH_FIRST

SQL_FETCH_LAST

SQL_FETCH_ABSOLUTE

SQL_FETCH_RELATIVE

SQL_FETCH_BOOKMARK

Pour plus d’informations, consultez « Positionnement du curseur » dans la section « Commentaires ».

FetchOffset
[Entrée]

Nombre de lignes à extraire. L’interprétation de cet argument dépend de la valeur de l’argument FetchOrientation . Pour plus d’informations, consultez « Positionnement du curseur » dans la section « Commentaires ».

Retours

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_STILL_EXECUTING, SQL_ERROR ou SQL_INVALID_HANDLE.

Diagnostics

Lorsque SQLFetchScroll retourne SQL_ERROR ou SQL_SUCCESS_WITH_INFO, une valeur SQLSTATE associée peut être obtenue en appelant SQLGetDiagRec avec un HandleType de SQL_HANDLE_STMT et un Handle of StatementHandle. Le tableau suivant répertorie les valeurs SQLSTATE couramment retournées par SQLFetchScroll et explique chacune d’elles dans le contexte de cette fonction ; la notation « (DM) » précède les descriptions de SQLSTATEs retournées par le Gestionnaire de pilotes. Le code de retour associé à chaque valeur SQLSTATE est SQL_ERROR, sauf indication contraire. Si une erreur se produit sur une seule colonne, SQLGetDiagField peut être appelé avec un DiagIdentifier de SQL_DIAG_COLUMN_NUMBER pour déterminer la colonne sur laquelle l’erreur s’est produite ; et SQLGetDiagField peut être appelé avec un DiagIdentifier de SQL_DIAG_ROW_NUMBER pour déterminer la ligne contenant cette colonne.

Pour tous les SQLSTATEs qui peuvent retourner SQL_SUCCESS_WITH_INFO ou SQL_ERROR (sauf 01xxx SQLSTATEs), SQL_SUCCESS_WITH_INFO est retourné si une erreur se produit sur une ou plusieurs lignes, mais pas toutes, les lignes d’une opération multirow et SQL_ERROR est retournée si une erreur se produit sur une opération à une seule ligne.

SQLSTATE Erreur Description
01000 Avertissement général Message d’information spécifique au pilote. (La fonction retourne SQL_SUCCESS_WITH_INFO.)
01004 Données de chaîne, tronquées à droite Les données de chaîne ou binaire retournées pour une colonne ont entraîné la troncation d’un caractère non vide ou de données binaires non NULL. S’il s’agissait d’une valeur de chaîne, elle était tronquée à droite.
01S01 Erreur dans la ligne Une erreur s’est produite lors de l’extraction d’une ou plusieurs lignes.

(Si ce SQLSTATE est retourné lorsqu’une application ODBC 3*.x* fonctionne avec un pilote ODBC 2*.x*, elle peut être ignorée.)
01S06 Tentative d’extraction avant que le jeu de résultats ne retourne le premier ensemble de lignes L’ensemble de lignes demandé se chevauche au début du jeu de résultats lorsque FetchOrientation a été SQL_FETCH_PRIOR, la position actuelle était au-delà de la première ligne et le nombre de la ligne actuelle est inférieur ou égal à la taille de l’ensemble de lignes.

L’ensemble de lignes demandé se chevauche au début du jeu de résultats lorsque FetchOrientation a été SQL_FETCH_PRIOR, la position actuelle était au-delà de la fin du jeu de résultats et la taille de l’ensemble de lignes était supérieure à la taille du jeu de résultats.

L’ensemble de lignes demandé se chevauche au début du jeu de résultats lorsque FetchOrientation a été SQL_FETCH_RELATIVE, FetchOffset a été négatif et la valeur absolue de FetchOffset était inférieure ou égale à la taille de l’ensemble de lignes.

L’ensemble de lignes demandé se chevauche au début du jeu de résultats lorsque FetchOrientation a été SQL_FETCH_ABSOLUTE, FetchOffset était négatif et la valeur absolue de FetchOffset était supérieure à la taille du jeu de résultats, mais inférieure ou égale à la taille de l’ensemble de lignes.

(La fonction retourne SQL_SUCCESS_WITH_INFO.)
01S07 Troncation fractionnelle Les données retournées pour une colonne ont été tronquées. Pour les types de données numériques, la partie fractionnaire du nombre a été tronquée. Pour les types de données time, timestamp et interval contenant un composant de temps, la partie fractionnaire de l’heure a été tronquée.

(La fonction retourne SQL_SUCCESS_WITH_INFO.)
07006 Violation d’attribut de type de données restreint La valeur de données d’une colonne dans le jeu de résultats n’a pas pu être convertie en type de données spécifié par TargetType dans SQLBindCol.

La colonne 0 a été liée à un type de données de SQL_C_BOOKMARK, et l’attribut d’instruction SQL_ATTR_USE_BOOKMARKS a été défini sur SQL_UB_VARIABLE.

La colonne 0 était liée à un type de données de SQL_C_VARBOOKMARK, et l’attribut d’instruction SQL_ATTR_USE_BOOKMARKS n’a pas été défini sur SQL_UB_VARIABLE.
07009 Index de descripteur non valide Le pilote était un pilote ODBC 2*.x* qui ne prend pas en charge SQLExtendedFetch et un numéro de colonne spécifié dans la liaison pour une colonne était 0.

La colonne 0 était liée et l’attribut d’instruction SQL_ATTR_USE_BOOKMARKS a été défini sur SQL_UB_OFF.
08S01 Échec du lien de communication Le lien de communication entre le pilote et la source de données à laquelle le pilote a été connecté a échoué avant l’achèvement du traitement de la fonction.
22001 Données de chaîne, tronquées à droite Un signet de longueur variable retourné pour une colonne a été tronqué.
22002 Variable d’indicateur requise, mais non fournie Les données NULL ont été extraites dans une colonne dont les StrLen_or_IndPtr définies par SQLBindCol (ou SQL_DESC_INDICATOR_PTR définies par SQLSetDescField ou SQLSetDescRec) étaient un pointeur Null.
22003 Valeur numérique hors plage Le renvoi de la valeur numérique (sous forme numérique ou chaîne) pour une ou plusieurs colonnes liées aurait provoqué la troncation de l’ensemble (par opposition à la fraction) du nombre.

Pour plus d’informations, consultez Conversion de données de SQL en types de données C dans l’annexe D : Types de données.
22007 Format datetime non valide Une colonne de caractères dans le jeu de résultats était liée à une structure C de date, d’heure ou d’horodatage, et une valeur dans la colonne était, respectivement, une date, une heure ou un horodatage non valide.
22012 Division par zéro Une valeur d’une expression arithmétique a été retournée, ce qui a entraîné la division par zéro.
22015 Dépassement de champ d’intervalle L’affectation d’un type SQL numérique ou d’intervalle exact à un type C d’intervalle a provoqué une perte de chiffres significatifs dans le champ de début.

Lors de l’extraction de données dans un type C d’intervalle, il n’y avait aucune représentation de la valeur du type SQL dans l’intervalle C type.
22018 Valeur de caractère non valide pour la spécification de cast Une colonne de caractères dans le jeu de résultats était liée à une mémoire tampon C de caractère, et la colonne contenait un caractère pour lequel il n’y avait aucune représentation dans le jeu de caractères de la mémoire tampon.

Le type C était un type numérique exact ou approximatif, un datetime ou un type de données d’intervalle ; le type SQL de la colonne était un type de données caractère ; et la valeur de la colonne n’était pas un littéral valide du type C lié.
24 000 État de curseur non valide L’instruction StatementHandle était dans un état exécuté, mais aucun jeu de résultats n’a été associé à l’instruction StatementHandle.
40001 Échec de sérialisation La transaction dans laquelle la récupération a été exécutée a été arrêtée pour empêcher l’interblocage.
40003 Saisie semi-automatique de l’instruction inconnue La connexion associée a échoué pendant l’exécution de cette fonction et l’état de la transaction ne peut pas être déterminé.
HY000 Erreur générale Une erreur s’est produite pour laquelle il n’y avait aucun SQLSTATE spécifique et pour lequel aucun SQLSTATE spécifique à l’implémentation n’a été défini. Le message d’erreur retourné par SQLGetDiagRec dans la mémoire tampon *MessageText décrit l’erreur et sa cause.
HY001 Erreur d’allocation de mémoire Le pilote n’a pas pu allouer de mémoire nécessaire pour prendre en charge l’exécution ou l’achèvement de la fonction.
HY008 Opération annulée Le traitement asynchrone a été activé pour StatementHandle. La fonction a été appelée et avant l’exécution terminée, SQLCancel ou SQLCancelHandle a été appelée sur StatementHandle. Ensuite, la fonction a été appelée à nouveau sur l’instructionHandle.

La fonction a été appelée et avant qu’elle ait terminé l’exécution, SQLCancel ou SQLCancelHandle a été appelée sur l’InstructionHandle à partir d’un autre thread dans une application multithread.
HY010 Erreur de séquence de fonction (DM) Une fonction en cours d’exécution asynchrone a été appelée pour le handle de connexion associé à StatementHandle. Cette fonction asynchrone était toujours en cours d’exécution lorsque la fonction SQLFetchScroll a été appelée.

(DM) SQLExecute, SQLExecDirect ou SQLMoreResults a été appelé pour l’instruction StatementHandle et retourné SQL_PARAM_DATA_AVAILABLE. Cette fonction a été appelée avant la récupération des données pour tous les paramètres diffusés en continu.

(DM) L’instruction StatementHandle spécifiée n’était pas dans un état exécuté. La fonction a été appelée sans appeler SQLExecDirect, SQLExecute ou une fonction de catalogue.

(DM) Une fonction en cours d’exécution asynchrone (et non celle-ci) a été appelée pour l’instruction StatementHandle et était toujours en cours d’exécution lorsque cette fonction a été appelée.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations ou SQLSetPos a été appelé pour l’instructionHandle et retourné SQL_NEED_DATA. Cette fonction a été appelée avant que les données ne soient envoyées pour tous les paramètres ou colonnes de données à l’exécution.

(DM) SQLFetch a été appelé pour l’instructionHandle après l’appel de SQLExtendedFetch et avant que SQLFreeStmt avec l’option SQL_CLOSE ait été appelée.
HY013 Erreur de gestion de la mémoire L’appel de fonction n’a pas pu être traité, car les objets de mémoire sous-jacents n’ont pas pu être accessibles, éventuellement en raison de conditions de mémoire insuffisantes.
HY090 Longueur de la chaîne ou de la mémoire tampon non valide L’attribut d’instruction SQL_ATTR_USE_BOOKMARK a été défini sur SQL_UB_VARIABLE, et la colonne 0 était liée à une mémoire tampon dont la longueur n’était pas égale à la longueur maximale du signet pour ce jeu de résultats. (Cette longueur est disponible dans le champ SQL_DESC_OCTET_LENGTH de l’IRD et peut être obtenue en appelant SQLDescribeCol, SQLColAttribute ou SQLGetDescField.)
HY106 Type d’extraction hors plage DM) La valeur spécifiée pour l’argument FetchOrientation n’était pas valide.

(DM) L’argument FetchOrientation a été SQL_FETCH_BOOKMARK et l’attribut d’instruction SQL_ATTR_USE_BOOKMARKS a été défini sur SQL_UB_OFF.

La valeur de l’attribut d’instruction SQL_ATTR_CURSOR_TYPE était SQL_CURSOR_FORWARD_ONLY et la valeur de l’argument FetchOrientation n’était pas SQL_FETCH_NEXT.

La valeur de l’attribut d’instruction SQL_ATTR_CURSOR_SCROLLABLE était SQL_NONSCROLLABLE et la valeur de l’argument FetchOrientation n’était pas SQL_FETCH_NEXT.
HY107 Valeur de ligne hors plage La valeur spécifiée avec l’attribut d’instruction SQL_ATTR_CURSOR_TYPE était SQL_CURSOR_KEYSET_DRIVEN, mais la valeur spécifiée avec l’attribut d’instruction SQL_ATTR_KEYSET_SIZE était supérieure à 0 et inférieure à la valeur spécifiée avec l’attribut d’instruction SQL_ATTR_ROW_ARRAY_SIZE.
HY111 Valeur de signet non valide L’argument FetchOrientation a été SQL_FETCH_BOOKMARK, et le signet pointé par la valeur de l’attribut d’instruction SQL_ATTR_FETCH_BOOKMARK_PTR n’était pas valide ou était un pointeur Null.
HY117 La connexion est suspendue en raison d’un état de transaction inconnu. Seules les fonctions de déconnexion et de lecture seule sont autorisées. (DM) Pour plus d’informations sur l’état suspendu, consultez la fonction SQLEndTran.
HYC00 Fonctionnalité facultative non implémentée Le pilote ou la source de données ne prend pas en charge la conversion spécifiée par la combinaison de TargetType dans SQLBindCol et du type de données SQL de la colonne correspondante.
HYT00 Délai expiré La période d’expiration de la requête a expiré avant que la source de données n’a retourné le jeu de résultats demandé. La période d’expiration est définie via SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 Délai d’attente de la connexion expiré La période d’expiration de la connexion a expiré avant que la source de données ne réponde à la demande. La période d’expiration de connexion est définie via SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Le pilote ne prend pas en charge cette fonction (DM) Le pilote associé à StatementHandle ne prend pas en charge la fonction.
IM017 L’interrogation est désactivée en mode de notification asynchrone Chaque fois que le modèle de notification est utilisé, l’interrogation est désactivée.
IM018 SQLCompleteAsync n’a pas été appelé pour terminer l’opération asynchrone précédente sur ce handle. Si l’appel de fonction précédent sur le handle retourne SQL_STILL_EXECUTING et si le mode de notification est activé, SQLCompleteAsync doit être appelé sur le handle pour effectuer un post-traitement et terminer l’opération.

Commentaires

SQLFetchScroll retourne un ensemble de lignes spécifié à partir du jeu de résultats. Les ensembles de lignes peuvent être spécifiés par position absolue ou relative ou par signet. SQLFetchScroll peut être appelé uniquement lorsqu’un jeu de résultats existe, c’est-à-dire après un appel qui crée un jeu de résultats et avant que le curseur sur ce jeu de résultats soit fermé. Si des colonnes sont liées, elle retourne les données de ces colonnes. Si l’application a spécifié un pointeur vers un tableau d’état de ligne ou une mémoire tampon dans laquelle retourner le nombre de lignes extraites, SQLFetchScroll retourne également ces informations. Les appels à SQLFetchScroll peuvent être mélangés avec des appels à SQLFetch , mais ne peuvent pas être mélangés avec des appels à SQLExtendedFetch.

Pour plus d’informations, consultez Utilisation des curseurs de bloc et utilisation de curseurs à défilement.

Positionnement du curseur

Lorsque le jeu de résultats est créé, le curseur est positionné avant le début du jeu de résultats. SQLFetchScroll positionne le curseur de bloc en fonction des valeurs des arguments FetchOrientation et FetchOffset , comme indiqué dans le tableau suivant. Les règles exactes pour déterminer le début du nouvel ensemble de lignes sont affichées dans la section suivante.

FetchOrientation Signification
SQL_FETCH_NEXT Retournez l’ensemble de lignes suivant. Cela équivaut à appeler SQLFetch.

SQLFetchScroll ignore la valeur de FetchOffset.
SQL_FETCH_PRIOR Retournez l’ensemble de lignes précédent.

SQLFetchScroll ignore la valeur de FetchOffset.
SQL_FETCH_RELATIVE Retourne l’ensemble de lignes FetchOffset à partir du début de l’ensemble de lignes actuel.
SQL_FETCH_ABSOLUTE Retourne l’ensemble de lignes à partir de la ligne FetchOffset.
SQL_FETCH_FIRST Retourne le premier ensemble de lignes dans le jeu de résultats.

SQLFetchScroll ignore la valeur de FetchOffset.
SQL_FETCH_LAST Retourne le dernier ensemble de lignes complet dans le jeu de résultats.

SQLFetchScroll ignore la valeur de FetchOffset.
SQL_FETCH_BOOKMARK Retournez les lignes FetchOffset de l’ensemble de lignes à partir du signet spécifié par l’attribut d’instruction SQL_ATTR_FETCH_BOOKMARK_PTR.

Les pilotes ne sont pas nécessaires pour prendre en charge toutes les orientations de récupération ; une application appelle SQLGetInfo avec un type d’informations de SQL_DYNAMIC_CURSOR_ATTRIBUTES1, de SQL_KEYSET_CURSOR_ATTRIBUTES1 ou de SQL_STATIC_CURSOR_ATTRIBUTES1 (selon le type du curseur) pour déterminer les orientations d’extraction prises en charge par le pilote. L’application doit examiner les masques de bits SQL_CA1_NEXT, SQL_CA1_RELATIVE, SQL_CA1_ABSOLUTE et WQL_CA1_BOOKMARK dans ces types d’informations. En outre, si le curseur est en avant uniquement et fetchOrientation n’est pas SQL_FETCH_NEXT, SQLFetchScroll retourne SQLSTATE HY106 (type d’extraction hors plage).

L’attribut d’instruction SQL_ATTR_ROW_ARRAY_SIZE spécifie le nombre de lignes dans l’ensemble de lignes. Si l’ensemble de lignes récupéré par SQLFetchScroll chevauche la fin du jeu de résultats, SQLFetchScroll retourne un ensemble de lignes partiel. Autrement dit, si S + R - 1 est supérieur à L, où S est la ligne de départ de l’ensemble de lignes récupéré, R est la taille de l’ensemble de lignes et L est la dernière ligne du jeu de résultats, puis seulement les premières lignes L - S + 1 de l’ensemble de lignes sont valides. Les lignes restantes sont vides et ont un état de SQL_ROW_NOROW.

Une fois QUE SQLFetchScroll retourne, la ligne actuelle est la première ligne de l’ensemble de lignes.

Règles de positionnement des curseurs

Les sections suivantes décrivent les règles exactes pour chaque valeur de FetchOrientation. Ces règles utilisent la notation suivante.

Notation Signification
Avant de commencer Le curseur de bloc est positionné avant le début du jeu de résultats. Si la première ligne du nouvel ensemble de lignes est avant le début du jeu de résultats, SQLFetchScroll retourne SQL_NO_DATA.
Après la fin Le curseur de bloc est positionné après la fin du jeu de résultats. Si la première ligne du nouvel ensemble de lignes se trouve après la fin du jeu de résultats, SQLFetchScroll retourne SQL_NO_DATA.
CurrRowsetStart Numéro de la première ligne de l’ensemble de lignes actuel.
LastResultRow Numéro de la dernière ligne du jeu de résultats.
RowsetSize Taille de l’ensemble de lignes.
FetchOffset Valeur de l’argument FetchOffset .
BookmarkRow Ligne correspondant au signet spécifié par l’attribut d’instruction SQL_ATTR_FETCH_BOOKMARK_PTR.

SQL_FETCH_NEXT

Les règles suivantes s’appliquent.

Condition Première ligne du nouvel ensemble de lignes
Avant de commencer 1
CurrRowsetStart + RowsetSize[1] <= LastResultRow CurrRowsetStart + RowsetSize[1]
CurrRowsetStart + RowsetSize[1]> LastResultRow Après la fin
Après la fin Après la fin

[1] Si la taille de l’ensemble de lignes a été modifiée depuis l’appel précédent pour extraire des lignes, il s’agit de la taille d’ensemble de lignes utilisée avec l’appel précédent.

SQL_FETCH_PRIOR

Les règles suivantes s’appliquent.

Condition Première ligne du nouvel ensemble de lignes
Avant de commencer Avant de commencer
CurrRowsetStart = 1 Avant de commencer
1 < CurrRowsetStart <= RowsetSize [2] 1 [1]
CurrRowsetStart > RowsetSize [2] CurrRowsetStart - RowsetSize [2]
Après la fin ET LastResultRow < RowsetSize [2] 1 [1]
Après la fin ET LastResultRow >= RowsetSize [2] LastResultRow - RowsetSize + 1 [2]

[1] SQLFetchScroll retourne SQLSTATE 01S06 (tentative d’extraction avant que le jeu de résultats ne renvoie le premier ensemble de lignes) et SQL_SUCCESS_WITH_INFO.

[2] Si la taille de l’ensemble de lignes a été modifiée depuis l’appel précédent pour extraire des lignes, il s’agit de la nouvelle taille d’ensemble de lignes.

SQL_FETCH_RELATIVE

Les règles suivantes s’appliquent.

Condition Première ligne du nouvel ensemble de lignes
(Avant de démarrer ET FetchOffset > 0) OU (après la fin ET FetchOffset < 0) --[1]
BeforeStart AND FetchOffset <= 0 Avant de commencer
CurrRowsetStart = 1 AND FetchOffset < 0 Avant de commencer
CurrRowsetStart > 1 AND CurrRowsetStart + FetchOffset < 1 AND | FetchOffset | > RowsetSize [3] Avant de commencer
CurrRowsetStart > 1 AND CurrRowsetStart + FetchOffset < 1 AND | FetchOffset | <= RowsetSize [3] 1 [2]
1 <= CurrRowsetStart + FetchOffset <= LastResultRow CurrRowsetStart + FetchOffset
CurrRowsetStart + FetchOffset > LastResultRow Après la fin
Après la fin ET FetchOffset >= 0 Après la fin

[1] SQLFetchScroll retourne le même ensemble de lignes que s’il a été appelé avec FetchOrientation défini sur SQL_FETCH_ABSOLUTE. Pour plus d’informations, consultez la section « SQL_FETCH_ABSOLUTE ».

[2] SQLFetchScroll retourne SQLSTATE 01S06 (tentative d’extraction avant que le jeu de résultats ne renvoie le premier ensemble de lignes) et SQL_SUCCESS_WITH_INFO.

[3] Si la taille de l’ensemble de lignes a été modifiée depuis l’appel précédent pour extraire des lignes, il s’agit de la nouvelle taille d’ensemble de lignes.

SQL_FETCH_ABSOLUTE

Les règles suivantes s’appliquent.

Condition Première ligne du nouvel ensemble de lignes
FetchOffset < 0 AND | FetchOffset | <= LastResultRow LastResultRow + FetchOffset + 1
FetchOffset < 0 AND | FetchOffset | > LastResultRow AND | FetchOffset | > RowsetSize [2] Avant de commencer
FetchOffset < 0 AND | FetchOffset | > LastResultRow AND | FetchOffset | <= RowsetSize [2] 1 [1]
FetchOffset = 0 Avant de commencer
1 <= FetchOffset <= LastResultRow FetchOffset
FetchOffset > LastResultRow Après la fin

[1] SQLFetchScroll retourne SQLSTATE 01S06 (tentative d’extraction avant que le jeu de résultats ne renvoie le premier ensemble de lignes) et SQL_SUCCESS_WITH_INFO.

[2] Si la taille de l’ensemble de lignes a été modifiée depuis l’appel précédent pour extraire des lignes, il s’agit de la nouvelle taille d’ensemble de lignes.

Une extraction absolue effectuée sur un curseur dynamique ne peut pas fournir le résultat requis, car les positions de ligne dans un curseur dynamique ne sont pas déterminée. Une telle opération équivaut d’abord à une extraction suivie d’un relatif d’extraction ; il ne s’agit pas d’une opération atomique, car il s’agit d’une extraction absolue sur un curseur statique.

SQL_FETCH_FIRST

Les règles suivantes s’appliquent.

Condition Première ligne du nouvel ensemble de lignes
N’importe lequel/laquelle 1

SQL_FETCH_LAST

Les règles suivantes s’appliquent.

Condition Première ligne du nouvel ensemble de lignes
RowsetSize [1]<= LastResultRow LastResultRow - RowsetSize + 1 [1]
RowsetSize [1]> LastResultRow 1

[1] Si la taille de l’ensemble de lignes a été modifiée depuis l’appel précédent pour extraire des lignes, il s’agit de la nouvelle taille d’ensemble de lignes.

SQL_FETCH_BOOKMARK

Les règles suivantes s’appliquent.

Condition Première ligne du nouvel ensemble de lignes
BookmarkRow + FetchOffset < 1 Avant de commencer
1 <= BookmarkRow + FetchOffset <= LastResultRow BookmarkRow + FetchOffset
BookmarkRow + FetchOffset > LastResultRow Après la fin

Pour plus d’informations sur les signets, consultez Signets (ODBC).

Effet des lignes supprimées, ajoutées et d’erreur sur le déplacement du curseur

Les curseurs statiques et pilotés par les jeux de clés détectent parfois les lignes ajoutées au jeu de résultats et suppriment les lignes supprimées du jeu de résultats. En appelant SQLGetInfo avec les options SQL_STATIC_CURSOR_ATTRIBUTES2 et SQL_KEYSET_CURSOR_ATTRIBUTES2 et en examinant les SQL_CA2_SENSITIVITY_ADDITIONS, les SQL_CA2_SENSITIVITY_DELETIONS et les masques de bits SQL_CA2_SENSITIVITY_UPDATES, une application détermine si les curseurs implémentés par un pilote particulier le font. Pour les pilotes qui peuvent détecter les lignes supprimées et les supprimer, les paragraphes suivants décrivent les effets de ce comportement. Pour les pilotes qui peuvent détecter les lignes supprimées, mais qui ne peuvent pas les supprimer, les suppressions n’ont aucun effet sur les mouvements de curseur et les paragraphes suivants ne s’appliquent pas.

Si le curseur détecte les lignes ajoutées au jeu de résultats ou supprime les lignes supprimées du jeu de résultats, il apparaît comme s’il détecte ces modifications uniquement lorsqu’il extrait des données. Cela inclut le cas où SQLFetchScroll est appelé avec FetchOrientation défini sur SQL_FETCH_RELATIVE et FetchOffset défini sur 0 pour refetch le même ensemble de lignes, mais n’inclut pas le cas où SQLSetPos est appelé avec fOption défini sur SQL_REFRESH. Dans ce dernier cas, les données des mémoires tampons de l’ensemble de lignes sont actualisées, mais pas refétées, et les lignes supprimées ne sont pas supprimées du jeu de résultats. Par conséquent, lorsqu’une ligne est supprimée ou insérée dans l’ensemble de lignes actuel, le curseur ne modifie pas les mémoires tampons de l’ensemble de lignes. Au lieu de cela, il détecte la modification lorsqu’elle extrait tout ensemble de lignes qui incluait précédemment la ligne supprimée ou inclut désormais la ligne insérée.

Par exemple :

// Fetch the next rowset.  
SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);  
// Delete third row of the rowset. Does not modify the rowset buffers.  
SQLSetPos(hstmt, 3, SQL_DELETE, SQL_LOCK_NO_CHANGE);  
// The third row has a status of SQL_ROW_DELETED after this call.  
SQLSetPos(hstmt, 3, SQL_REFRESH, SQL_LOCK_NO_CHANGE);  
// Refetch the same rowset. The third row is removed, replaced by what  
// was previously the fourth row.  
SQLFetchScroll(hstmt, SQL_FETCH_RELATIVE, 0);  

Lorsque SQLFetchScroll retourne un nouvel ensemble de lignes qui a une position par rapport à l’ensemble de lignes actuel ( autrement dit, FetchOrientation est SQL_FETCH_NEXT, SQL_FETCH_PRIOR ou SQL_FETCH_RELATIVE ), il n’inclut pas les modifications apportées à l’ensemble de lignes actuel lors du calcul de la position de départ du nouvel ensemble de lignes. Toutefois, il inclut des modifications en dehors de l’ensemble de lignes actuel s’il est capable de les détecter. En outre, lorsque SQLFetchScroll retourne un nouvel ensemble de lignes qui a une position indépendante de l’ensemble de lignes actuel , autrement dit, FetchOrientation est SQL_FETCH_FIRST, SQL_FETCH_LAST, SQL_FETCH_ABSOLUTE ou SQL_FETCH_BOOKMARK - il inclut toutes les modifications qu’il est capable de détecter, même s’ils se trouvent dans l’ensemble de lignes actuel.

Lorsque vous déterminez si les lignes nouvellement ajoutées se trouvent à l’intérieur ou à l’extérieur de l’ensemble de lignes actuel, un ensemble de lignes partiel est considéré comme se mettant fin à la dernière ligne valide ; c’est-à-dire la dernière ligne pour laquelle l’état de la ligne n’est pas SQL_ROW_NOROW. Par exemple, supposons que le curseur soit capable de détecter les lignes nouvellement ajoutées, que l’ensemble de lignes actuel est un ensemble de lignes partiel, que l’application ajoute de nouvelles lignes et que le curseur ajoute ces lignes à la fin du jeu de résultats. Si l’application appelle SQLFetchScroll avec FetchOrientation définie sur SQL_FETCH_NEXT, SQLFetchScroll retourne l’ensemble de lignes commençant par la première ligne nouvellement ajoutée.

Par exemple, supposons que l’ensemble de lignes actuel comprend les lignes 21 à 30, la taille de l’ensemble de lignes est 10, le curseur supprime les lignes supprimées du jeu de résultats et le curseur détecte les lignes ajoutées au jeu de résultats. Le tableau suivant montre les lignes retournées par SQLFetchScroll dans différentes situations.

Modifier Type d’extraction FetchOffset Nouvel ensemble de lignes[1]
Supprimer la ligne 21 SUIVANT 0 31 à 40
Supprimer la ligne 31 SUIVANT 0 32 à 41
Insérer une ligne entre les lignes 21 et 22 SUIVANT 0 31 à 40
Insérer une ligne entre les lignes 30 et 31 SUIVANT 0 Ligne insérée, 31 à 39
Supprimer la ligne 21 PRIOR 0 11 à 20
Supprimer la ligne 20 PRIOR 0 10 à 19
Insérer une ligne entre les lignes 21 et 22 PRIOR 0 11 à 20
Insérer une ligne entre les lignes 20 et 21 PRIOR 0 12 à 20, ligne insérée
Supprimer la ligne 21 RELATIVE 0 22 à 31[2]
Supprimer la ligne 21 RELATIVE 1 22 à 31
Insérer une ligne entre les lignes 21 et 22 RELATIVE 0 21, ligne insérée, 22 à 29
Insérer une ligne entre les lignes 21 et 22 RELATIVE 1 22 à 31
Supprimer la ligne 21 ABSOLUTE 21 22 à 31[2]
Supprimer la ligne 22 ABSOLUTE 21 21, 23 à 31
Insérer une ligne entre les lignes 21 et 22 ABSOLUTE 22 Ligne insérée, 22 à 29

[1] Cette colonne utilise les numéros de ligne avant que toutes les lignes aient été insérées ou supprimées.

[2] Dans ce cas, le curseur tente de retourner des lignes à partir de la ligne 21. Étant donné que la ligne 21 a été supprimée, la première ligne retournée est la ligne 22.

Les lignes d’erreur (autrement dit, les lignes dont l’état est SQL_ROW_ERROR) n’affectent pas le déplacement du curseur. Par exemple, si l’ensemble de lignes actuel commence par la ligne 11 et que l’état de la ligne 11 est SQL_ROW_ERROR, l’appel de SQLFetchScroll avec FetchOrientation défini sur SQL_FETCH_RELATIVE et FetchOffset défini sur 5 retourne l’ensemble de lignes commençant par la ligne 16, comme si l’état de la ligne 11 était SQL_SUCCESS.

Retour de données dans des colonnes liées

SQLFetchScroll retourne des données dans des colonnes liées de la même façon que SQLFetch. Pour plus d’informations, consultez « Retour de données dans des colonnes liées » dans la fonction SQLFetch.

Si aucune colonne n’est liée, SQLFetchScroll ne retourne pas de données, mais déplace le curseur de bloc vers la position spécifiée. Si les données peuvent être récupérées à partir de colonnes indépendantes d’un curseur de bloc avec SQLGetData dépend du pilote. Cette fonctionnalité est prise en charge si un appel à SQLGetInfo retourne le bit SQL_GD_BLOCK pour le type d’informations SQL_GETDATA_EXTENSIONS.

Adresses de mémoire tampon

SQLFetchScroll utilise la même formule pour déterminer l’adresse des données et des mémoires tampons de longueur/indicateur que SQLFetch. Pour plus d’informations, consultez « Adresses de mémoire tampon » dans la fonction SQLBindCol.

Tableau d’état des lignes

SQLFetchScroll définit des valeurs dans le tableau d’état de ligne de la même manière que SQLFetch. Pour plus d’informations, consultez « Tableau d’état des lignes » dans la fonction SQLFetch.

Mémoire tampon extraite des lignes

SQLFetchScroll retourne le nombre de lignes extraites dans la mémoire tampon extraite de la même manière que SQLFetch. Pour plus d’informations, consultez « Mémoire tampon extraite des lignes » dans la fonction SQLFetch.

Gestion des erreurs

Lorsqu’une application appelle SQLFetchScroll dans un pilote ODBC 3.x, le Gestionnaire de pilotes appelle SQLFetchScroll dans le pilote. Lorsqu’une application appelle SQLFetchScroll dans un pilote ODBC 2.x, le Gestionnaire de pilotes appelle SQLExtendedFetch dans le pilote. Étant donné que SQLFetchScroll et SQLExtendedFetch gèrent les erreurs de manière légèrement différente, l’application voit un comportement d’erreur légèrement différent lorsqu’elle appelle SQLFetchScroll dans les pilotes ODBC 2.x et ODBC 3.x.

SQLFetchScroll retourne des erreurs et des avertissements de la même manière que SQLFetch. Pour plus d’informations, consultez « Gestion des erreurs » dans SQLFetch. SQLExtendedFetch retourne des erreurs de la même manière que SQLFetch, avec les exceptions suivantes :

Lorsqu’un avertissement se produit qui s’applique à une ligne particulière dans l’ensemble de lignes, SQLExtendedFetch définit l’entrée correspondante dans le tableau d’état de ligne sur SQL_ROW_SUCCESS, et non SQL_ROW_SUCCESS_WITH_INFO.

Si des erreurs se produisent dans chaque ligne de l’ensemble de lignes, SQLExtendedFetch retourne SQL_SUCCESS_WITH_INFO, et non SQL_ERROR.

Dans chaque groupe d’enregistrements d’état qui s’applique à une ligne individuelle, le premier enregistrement d’état retourné par SQLExtendedFetch doit contenir SQLSTATE 01S01 (Erreur dans la ligne) ; SQLFetchScroll ne retourne pas ce SQLSTATE. Si SQLExtendedFetch ne peut pas retourner d’autres SQLSTATEs, il doit toujours renvoyer ce SQLSTATE.

Accès concurrentiel SQLFetchScroll et optimiste

Si un curseur utilise l’accès concurrentiel optimiste , autrement dit, l’attribut d’instruction SQL_ATTR_CONCURRENCY a une valeur de SQL_CONCUR_VALUES ou de SQL_CONCUR_ROWVER - SQLFetchScroll met à jour les valeurs d’accès concurrentiel optimiste utilisées par la source de données pour détecter si une ligne a changé. Cela se produit chaque fois que SQLFetchScroll récupère un nouvel ensemble de lignes, y compris lorsqu’il refétise l’ensemble de lignes actuel. (Il est appelé avec FetchOrientation défini sur SQL_FETCH_RELATIVE et FetchOffset défini sur 0.)

Pilotes SQLFetchScroll et ODBC 2.x

Lorsqu’une application appelle SQLFetchScroll dans un pilote ODBC 2.x, le Gestionnaire de pilotes mappe cet appel à SQLExtendedFetch. Il transmet les valeurs suivantes pour les arguments de SQLExtendedFetch.

Argument SQLExtendedFetch Valeur
StatementHandle StatementHandle dans SQLFetchScroll.
FetchOrientation FetchOrientation dans SQLFetchScroll.
FetchOffset Si FetchOrientation n’est pas SQL_FETCH_BOOKMARK, la valeur de l’argument FetchOffset dans SQLFetchScroll est utilisée.

Si FetchOrientation est SQL_FETCH_BOOKMARK, la valeur stockée à l’adresse spécifiée par l’attribut d’instruction SQL_ATTR_FETCH_BOOKMARK_PTR est utilisée.
RowCountPtr Adresse spécifiée par l’attribut d’instruction SQL_ATTR_ROWS_FETCHED_PTR.
RowStatusArray Adresse spécifiée par l’attribut d’instruction SQL_ATTR_ROW_STATUS_PTR.

Pour plus d’informations, consultez Bloquer les curseurs de bloc, les curseurs à défilement et la compatibilité descendante dans l’annexe G : Instructions relatives à la compatibilité descendante.

Descriptors et SQLFetchScroll

SQLFetchScroll interagit avec des descripteurs de la même manière que SQLFetch. Pour plus d’informations, consultez la section « Descriptors et SQLFetchScroll » dans la fonction SQLFetch.

Exemple de code

Consultez la liaison à l’aide des colonnes, de la liaison ligne, des instructions de mise à jour et de suppression positionnées et de mise à jour des lignes dans l’ensemble de lignes avec SQLSetPos.

Pour plus d’informations sur Consultez
Liaison d’une mémoire tampon à une colonne dans un jeu de résultats SQLBindCol, fonction
Exécution d’opérations d’insertion, de mise à jour ou de suppression en bloc SQLBulkOperations, fonction
Annulation du traitement des instructions SQLCancel, fonction
Retour d’informations sur une colonne dans un jeu de résultats SQLDescribeCol, fonction
Exécution d’une instruction SQL SQLExecDirect, fonction
Exécution d’une instruction SQL préparée SQLExecute, fonction
Extraction d’une seule ligne ou d’un bloc de données dans une direction vers l’avant uniquement SQLFetch, fonction
Fermeture du curseur sur l’instruction SQLFreeStmt, fonction
Renvoi du nombre de colonnes du jeu de résultats SQLNumResultCols, fonction
Positionnement du curseur, actualisation des données dans l’ensemble de lignes ou mise à jour ou suppression de données dans le jeu de résultats SQLSetPos, fonction
Définition d’un attribut d’instruction SQLSetStmtAttr, fonction

Voir aussi

Informations de référence sur l’API ODBC
Fichiers d’en-tête ODBC