SQLFetchScroll-Funktion
Konformität
Version eingeführt: ODBC 3.0-Normenkonformität: ISO 92
Zusammenfassung
SQLFetchScroll ruft das angegebene Rowset der Daten aus dem Resultset ab und gibt Daten für alle gebundenen Spalten zurück. Rowsets können an einer absoluten oder relativen Position oder durch Lesezeichen angegeben werden.
Wenn Sie mit einem ODBC 2.x-Treiber arbeiten, ordnet der Treiber-Manager diese Funktion SQLExtendedFetch zu. Weitere Informationen finden Sie unter Zuordnen von Ersatzfunktionen für die Abwärtskompatibilität von Anwendungen.
Syntax
SQLRETURN SQLFetchScroll(
SQLHSTMT StatementHandle,
SQLSMALLINT FetchOrientation,
SQLLEN FetchOffset);
Argumente
StatementHandle
[Eingabe] Anweisungshandle.
FetchOrientation
[Eingabe]
Art des Abrufs:
SQL_FETCH_NEXT
SQL_FETCH_PRIOR
SQL_FETCH_FIRST
SQL_FETCH_LAST
SQL_FETCH_ABSOLUTE
SQL_FETCH_RELATIVE
SQL_FETCH_BOOKMARK
Weitere Informationen finden Sie unter Positionieren des Cursors im Abschnitt "Kommentare".
FetchOffset
[Eingabe]
Nummer der abzurufenden Zeile. Die Interpretation dieses Arguments hängt vom Wert des FetchOrientation-Arguments ab. Weitere Informationen finden Sie unter Positionieren des Cursors im Abschnitt "Kommentare".
Gibt zurück
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_STILL_EXECUTING, SQL_ERROR oder SQL_INVALID_HANDLE.
Diagnose
Wenn SQLFetchScroll entweder SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurückgibt, kann ein zugeordneter SQLSTATE-Wert abgerufen werden, indem SQLGetDiagRec mit einem HandleType von SQL_HANDLE_STMT und einem Handle of StatementHandle aufgerufen wird. In der folgenden Tabelle sind die SQLSTATE-Werte aufgeführt, die häufig von SQLFetchScroll zurückgegeben werden, und die einzelnen Werte werden im Kontext dieser Funktion erläutert. die Notation "(DM)" geht den Beschreibungen von SQLSTATEs voran, die vom Treiber-Manager zurückgegeben werden. Der rückgabecode, der jedem SQLSTATE-Wert zugeordnet ist, ist SQL_ERROR, sofern nicht anders angegeben. Wenn ein Fehler für eine einzelne Spalte auftritt, kann SQLGetDiagField mit einem DiagIdentifier von SQL_DIAG_COLUMN_NUMBER aufgerufen werden, um die Spalte zu bestimmen, in der der Fehler aufgetreten ist. und SQLGetDiagField kann mit einem DiagIdentifier von SQL_DIAG_ROW_NUMBER aufgerufen werden, um die Zeile zu bestimmen, die diese Spalte enthält.
Für alle SQLSTATEs, die SQL_SUCCESS_WITH_INFO oder SQL_ERROR zurückgeben können (außer 01xxx SQLSTATEs), wird SQL_SUCCESS_WITH_INFO zurückgegeben, wenn ein Fehler für eine oder mehrere Zeilen eines Mehrzeilenvorgangs auftritt, und SQL_ERROR zurückgegeben wird, wenn ein Fehler bei einem Einzeilenvorgang auftritt.
SQLSTATE | Fehler | BESCHREIBUNG |
---|---|---|
01000 | Allgemeine Warnung | Treiberspezifische Informationsmeldung. (Die Funktion gibt SQL_SUCCESS_WITH_INFO zurück.) |
01004 | Zeichenfolgendaten, rechts abgeschnitten | Zeichenfolgen- oder Binärdaten, die für eine Spalte zurückgegeben wurden, führten zum Abschneiden von Nichtblankzeichen- oder Nicht-NULL-Binärdaten. Wenn es sich um einen Zeichenfolgenwert handelte, wurde er rechts abgeschnitten. |
01S01 | Fehler in Zeile | Beim Abrufen einer oder mehrerer Zeilen ist ein Fehler aufgetreten. (Wenn dieser SQLSTATE zurückgegeben wird, wenn eine ODBC 3*.x*-Anwendung mit einem ODBC 2*.x*-Treiber arbeitet, kann sie ignoriert werden.) |
01S06 | Versuchen sie zu abrufen, bevor das Resultset das erste Rowset zurückgegeben hat. | Das angeforderte Rowset überlappt den Anfang des Resultsets, wenn FetchOrientation SQL_FETCH_PRIOR wurde, die aktuelle Position außerhalb der ersten Zeile lag und die Anzahl der aktuellen Zeile kleiner oder gleich der Rowsetgröße ist. Das angeforderte Rowset überlappt den Anfang des Resultsets, wenn FetchOrientation SQL_FETCH_PRIOR wurde, die aktuelle Position über das Ende des Resultsets hinaus lag und die Rowsetgröße größer als die Resultsetgröße war. Das angeforderte Rowset überlappt den Start des Resultsets, als FetchOrientation SQL_FETCH_RELATIVE, FetchOffset negativ war und der absolute Wert von FetchOffset kleiner oder gleich der Rowsetgröße war. Das angeforderte Rowset überlappt den Start des Resultsets, wenn FetchOrientation SQL_FETCH_ABSOLUTE, FetchOffset negativ war und der absolute Wert von FetchOffset größer als die Resultsetgröße, aber kleiner oder gleich der Rowsetgröße war. (Die Funktion gibt SQL_SUCCESS_WITH_INFO zurück.) |
01S07 | Bruchabkürzung | Die für eine Spalte zurückgegebenen Daten wurden abgeschnitten. Bei numerischen Datentypen wurde der Bruchteil der Zahl abgeschnitten. Bei Zeit-, Zeitstempel- und Intervalldatentypen, die eine Zeitkomponente enthielten, wurde der Bruchteil der Zeit abgeschnitten. (Die Funktion gibt SQL_SUCCESS_WITH_INFO zurück.) |
07006 | Verletzung eines eingeschränkten Datentypattributes | Der Datenwert einer Spalte im Resultset konnte nicht in den von TargetType in SQLBindCol angegebenen Datentyp konvertiert werden. Spalte 0 war an einen Datentyp von SQL_C_BOOKMARK gebunden, und das Attribut SQL_ATTR_USE_BOOKMARKS-Anweisung wurde auf SQL_UB_VARIABLE festgelegt. Spalte 0 war an einen Datentyp von SQL_C_VARBOOKMARK gebunden, und das Attribut der SQL_ATTR_USE_BOOKMARKS-Anweisung wurde nicht auf SQL_UB_VARIABLE festgelegt. |
07009 | Ungültiger Deskriptorindex | Der Treiber war ein ODBC 2*.x*-Treiber, der SQLExtendedFetch nicht unterstützt, und eine in der Bindung für eine Spalte angegebene Spaltennummer war 0. Spalte 0 war gebunden, und das Attribut SQL_ATTR_USE_BOOKMARKS-Anweisung wurde auf SQL_UB_OFF festgelegt. |
08S01 | Kommunikationslinkfehler | Die Kommunikationsverbindung zwischen dem Treiber und der Datenquelle, mit der der Treiber verbunden war, ist fehlgeschlagen, bevor die Verarbeitung der Funktion abgeschlossen wurde. |
22001 | Zeichenfolgendaten, rechts abgeschnitten | Ein Für eine Spalte zurückgegebenes Lesezeichen mit variabler Länge wurde abgeschnitten. |
22002 | Indikatorvariable erforderlich, aber nicht angegeben | NULL-Daten wurden in eine Spalte abgerufen, deren StrLen_or_IndPtr durch SQLBindCol (oder SQL_DESC_INDICATOR_PTR festgelegt durch SQLSetDescField oder SQLSetDescRec) ein NULL-Zeiger war. |
22003 | Numerischer Wert außerhalb des Bereichs | Das Zurückgeben des numerischen Werts (als numerisch oder Zeichenfolge) für eine oder mehrere gebundene Spalten hätte dazu geführt, dass der gesamte Teil der Zahl (im Gegensatz zur Bruchzahl) abgeschnitten wurde. Weitere Informationen finden Sie unter Konvertieren von Daten aus SQL in C-Datentypen in Anhang D: Datentypen. |
22007 | Ungültiges datetime-Format | Eine Zeichenspalte im Resultset war an eine Datums-, Uhrzeit- oder Zeitstempel-C-Struktur gebunden, und ein Wert in der Spalte war jeweils ein ungültiges Datum, eine ungültige Uhrzeit oder ein ungültiger Zeitstempel. |
22012 | Division by Zero | Ein Wert aus einem arithmetischen Ausdruck wurde zurückgegeben, was zu einer Division durch 0 führte. |
22015 | Intervallfeldüberlauf | Das Zuweisen eines genauen numerischen oder Intervall-SQL-Typs zu einem Intervall-C-Typ führte zu einem Verlust signifikanter Ziffern im führenden Feld. Beim Abrufen von Daten in einen Intervall-C-Typ gab es keine Darstellung des Werts des SQL-Typs im Intervalltyp C. |
22018 | Ungültiger Zeichenwert für die Umwandlungsspezifikation | Eine Zeichenspalte im Resultset wurde an einen Zeichen C-Puffer gebunden, und die Spalte enthielt ein Zeichen, für das im Zeichensatz des Puffers keine Darstellung vorhanden war. Der C-Typ war ein genauer oder ungefährer numerischer Datentyp, ein datetime- oder ein Intervalldatentyp. Der SQL-Typ der Spalte war ein Zeichendatentyp; und der Wert in der Spalte war kein gültiges Literal des gebundenen C-Typs. |
24.000 | Ungültiger Cursorstatus | Die StatementHandle-Instanz befand sich in einem ausgeführten Zustand, aber es wurde kein Resultset dem StatementHandle zugeordnet. |
40001 | Serialisierungsfehler | Die Transaktion, in der der Abruf ausgeführt wurde, wurde beendet, um einen Deadlock zu verhindern. |
40003 | Anweisungsabschluss unbekannt | Die zugeordnete Verbindung ist während der Ausführung dieser Funktion fehlgeschlagen, und der Status der Transaktion kann nicht bestimmt werden. |
HY000 | Allgemeiner Fehler | Es ist ein Fehler aufgetreten, für den kein spezifischer SQLSTATE-Wert vorhanden war und für den keine implementierungsspezifische SQLSTATE definiert wurde. Die von SQLGetDiagRec im *MessageText-Puffer zurückgegebene Fehlermeldung beschreibt den Fehler und seine Ursache. |
HY001 | Fehler bei der Speicherbelegung | Der Treiber konnte keinen Arbeitsspeicher zuordnen, der für die Unterstützung der Ausführung oder Fertigstellung der Funktion erforderlich ist. |
HY008 | Vorgang abgebrochen | Die asynchrone Verarbeitung wurde für statementHandle aktiviert. Die Funktion wurde aufgerufen, und vor Abschluss der Ausführung wurde SQLCancel oder SQLCancelHandle für statementHandle aufgerufen. Anschließend wurde die Funktion für die AnweisungHandle erneut aufgerufen. Die Funktion wurde aufgerufen, und bevor die Ausführung abgeschlossen wurde, wurde SQLCancel oder SQLCancelHandle für die StatementHandle aus einem anderen Thread in einer Multithreadanwendung aufgerufen. |
HY010 | Funktionssequenzfehler | (DM) Eine asynchron ausgeführte Funktion wurde für das Verbindungshandle aufgerufen, das dem StatementHandle zugeordnet ist. Diese asynchrone Funktion wurde noch ausgeführt, als die FUNKTION SQLFetchScroll aufgerufen wurde. (DM) SQLExecute, SQLExecDirect oder SQLMoreResults wurde für statementHandle aufgerufen und SQL_PARAM_DATA_AVAILABLE zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle gestreamten Parameter abgerufen wurden. (DM) Der angegebene StatementHandle befand sich nicht im Ausführungszustand. Die Funktion wurde aufgerufen, ohne zuerst SQLExecDirect, SQLExecute oder eine Katalogfunktion aufzurufen. (DM) Eine asynchron ausgeführte Funktion (nicht diese) wurde für das StatementHandle aufgerufen und wurde noch ausgeführt, als diese Funktion aufgerufen wurde. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations oder SQLSetPos wurde für statementHandle aufgerufen und SQL_NEED_DATA zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle Daten bei der Ausführungsparameter oder -spalten gesendet wurden. (DM) SQLFetch wurde für statementHandle aufgerufen, nachdem SQLExtendedFetch aufgerufen wurde und bevor SQLFreeStmt mit der option SQL_CLOSE aufgerufen wurde. |
HY013 | Fehler bei der Speicherverwaltung | Der Funktionsaufruf konnte nicht verarbeitet werden, weil auf die zugrunde liegenden Speicherobjekte nicht zugegriffen werden konnte, möglicherweise aufgrund von geringen Arbeitsspeicherbedingungen. |
HY090 | Ungültige Zeichenfolgen- oder Pufferlänge | Das SQL_ATTR_USE_BOOKMARK-Anweisungsattribut wurde auf SQL_UB_VARIABLE festgelegt, und Spalte 0 wurde an einen Puffer gebunden, dessen Länge nicht der maximalen Länge für das Lesezeichen für dieses Resultset entsprach. (Diese Länge ist im Feld SQL_DESC_OCTET_LENGTH der IRD verfügbar und kann durch Aufrufen von SQLDescribeCol, SQLColAttribute oder SQLGetDescField abgerufen werden.) |
HY106 | Abrufen des Typs außerhalb des Bereichs | DM) Der für das Argument FetchOrientation angegebene Wert war ungültig. (DM) Das Argument FetchOrientation wurde SQL_FETCH_BOOKMARK, und das Attribut der SQL_ATTR_USE_BOOKMARKS-Anweisung wurde auf SQL_UB_OFF festgelegt. Der Wert des SQL_ATTR_CURSOR_TYPE-Anweisungsattributs wurde SQL_CURSOR_FORWARD_ONLY, und der Wert des Arguments FetchOrientation wurde nicht SQL_FETCH_NEXT. Der Wert des SQL_ATTR_CURSOR_SCROLLABLE-Anweisungsattributs wurde SQL_NONSCROLLABLE, und der Wert des Arguments FetchOrientation wurde nicht SQL_FETCH_NEXT. |
HY107 | Zeilenwert außerhalb des Bereichs | Der mit dem SQL_ATTR_CURSOR_TYPE-Anweisungsattribut angegebene Wert wurde SQL_CURSOR_KEYSET_DRIVEN, aber der mit dem SQL_ATTR_KEYSET_SIZE-Anweisungsattribut angegebene Wert war größer als 0 und kleiner als der mit dem SQL_ATTR_ROW_ARRAY_SIZE-Anweisungsattribut angegebene Wert. |
HY111 | Ungültiger Lesezeichenwert | Das Argument FetchOrientation wurde SQL_FETCH_BOOKMARK, und das Lesezeichen, auf das der Wert im SQL_ATTR_FETCH_BOOKMARK_PTR-Anweisungsattribut verweist, war ungültig oder ein NULL-Zeiger. |
HY117 | Die Verbindung wird aufgrund eines unbekannten Transaktionsstatus angehalten. Nur trenn- und schreibgeschützte Funktionen sind zulässig. | (DM) Weitere Informationen zum angehaltenen Zustand finden Sie unter SQLEndTran-Funktion. |
HYC00 | Optionales Feature nicht implementiert | Der Treiber oder die Datenquelle unterstützt nicht die Konvertierung, die durch die Kombination von TargetType in SQLBindCol und dem SQL-Datentyp der entsprechenden Spalte angegeben wird. |
HYT00 | Timeout abgelaufen | Der Abfragetimeoutzeitraum ist abgelaufen, bevor die Datenquelle das angeforderte Resultset zurückgegeben hat. Der Timeoutzeitraum wird über SQLSetStmtAttr festgelegt, SQL_ATTR_QUERY_TIMEOUT. |
HYT01 | Verbindungstimeout abgelaufen | Der Zeitraum für das Verbindungstimeout ist abgelaufen, bevor die Datenquelle auf die Anforderung geantwortet hat. Der Verbindungstimeoutzeitraum wird über SQLSetConnectAttr festgelegt, SQL_ATTR_CONNECTION_TIMEOUT. |
IM001 | Treiber unterstützt diese Funktion nicht. | (DM) Der Der StatementHandle zugeordnete Treiber unterstützt die Funktion nicht. |
IM017 | Abruf ist im asynchronen Benachrichtigungsmodus deaktiviert. | Wenn das Benachrichtigungsmodell verwendet wird, wird die Abfrage deaktiviert. |
IM018 | SQLCompleteAsync wurde nicht aufgerufen, um den vorherigen asynchronen Vorgang für dieses Handle abzuschließen. | Wenn der vorherige Funktionsaufruf für das Handle SQL_STILL_EXECUTING zurückgibt und der Benachrichtigungsmodus aktiviert ist, muss SQLCompleteAsync für das Handle aufgerufen werden, um die Nachverarbeitung durchzuführen und den Vorgang abzuschließen. |
Kommentare
SQLFetchScroll gibt ein angegebenes Rowset aus dem Resultset zurück. Rowsets können durch absolute oder relative Position oder durch Lesezeichen angegeben werden. SQLFetchScroll kann nur aufgerufen werden, solange ein Resultset vorhanden ist, d. h. nach einem Aufruf, der ein Resultset erstellt, und bevor der Cursor über diesem Resultset geschlossen wird. Wenn Spalten gebunden sind, werden die Daten in diesen Spalten zurückgegeben. Wenn die Anwendung einen Zeiger auf ein Zeilenstatusarray oder einen Puffer angegeben hat, in dem die Anzahl der abgerufenen Zeilen zurückgegeben werden soll, gibt SQLFetchScroll auch diese Informationen zurück. Aufrufe von SQLFetchScroll können mit Aufrufen von SQLFetch gemischt, aber nicht mit Aufrufen von SQLExtendedFetch gemischt werden.
Weitere Informationen finden Sie unter Verwenden von Blockcursors und Verwenden von scrollbaren Cursorn.
Positionieren des Cursors
Wenn das Resultset erstellt wird, wird der Cursor vor dem Anfang des Resultsets positioniert. SQLFetchScroll positioniert den Blockcursor basierend auf den Werten der Argumente FetchOrientation und FetchOffset , wie in der folgenden Tabelle gezeigt. Die genauen Regeln zum Bestimmen des Anfangs des neuen Rowsets werden im nächsten Abschnitt gezeigt.
FetchOrientation | Bedeutung |
---|---|
SQL_FETCH_NEXT | Gibt das nächste Rowset zurück. Dies entspricht dem Aufrufen von SQLFetch. SQLFetchScroll ignoriert den Wert von FetchOffset. |
SQL_FETCH_PRIOR | Gibt das vorherige Rowset zurück. SQLFetchScroll ignoriert den Wert von FetchOffset. |
SQL_FETCH_RELATIVE | Gibt das Rowset FetchOffset vom Anfang des aktuellen Rowsets zurück. |
SQL_FETCH_ABSOLUTE | Gibt das Rowset ab Zeile FetchOffset zurück. |
SQL_FETCH_FIRST | Gibt das erste Rowset im Resultset zurück. SQLFetchScroll ignoriert den Wert von FetchOffset. |
SQL_FETCH_LAST | Gibt das letzte vollständige Rowset im Resultset zurück. SQLFetchScroll ignoriert den Wert von FetchOffset. |
SQL_FETCH_BOOKMARK | Gibt die Rowset-Zeilen FetchOffset aus dem Lesezeichen zurück, das durch das SQL_ATTR_FETCH_BOOKMARK_PTR-Anweisungsattribut angegeben ist. |
Treiber sind nicht erforderlich, um alle Abrufausrichtungen zu unterstützen. eine Anwendung ruft SQLGetInfo mit dem Informationstyp SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 oder SQL_STATIC_CURSOR_ATTRIBUTES1 (abhängig vom Typ des Cursors) auf, um zu bestimmen, welche Abrufausrichtungen vom Treiber unterstützt werden. Die Anwendung sollte sich die bitmasken SQL_CA1_NEXT, SQL_CA1_RELATIVE, SQL_CA1_ABSOLUTE und WQL_CA1_BOOKMARK in diesen Informationstypen ansehen. Wenn der Cursor nur vorwärts ist und FetchOrientation nicht SQL_FETCH_NEXT ist, gibt SQLFetchScroll SQLSTATE HY106 (Fetch-Typ außerhalb des Bereichs) zurück.
Das SQL_ATTR_ROW_ARRAY_SIZE-Anweisungsattribut gibt die Anzahl der Zeilen im Rowset an. Wenn das von SQLFetchScroll abgerufene Rowset das Ende des Resultsets überschneidet, gibt SQLFetchScroll ein partielles Rowset zurück. Das heißt, wenn S + R - 1 größer als L ist, wobei S die Anfangszeile des abgerufenen Rowsets, R die Rowsetgröße und L die letzte Zeile im Resultset ist, sind nur die ersten L - S + 1 Zeilen des Rowsets gültig. Die restlichen Zeilen sind leer und haben den Status SQL_ROW_NOROW.
Nachdem SQLFetchScroll zurückgegeben wurde, ist die aktuelle Zeile die erste Zeile des Rowsets.
Cursorpositionierungsregeln
In den folgenden Abschnitten werden die genauen Regeln für jeden Wert von FetchOrientation beschrieben. Diese Regeln verwenden die folgende Notation.
Notation | Bedeutung |
---|---|
Vor dem Start | Der Blockcursor wird vor dem Start des Resultsets positioniert. Wenn sich die erste Zeile des neuen Rowsets vor dem Start des Resultsets befindet, gibt SQLFetchScroll SQL_NO_DATA zurück. |
Nach Dem Ende | Der Blockcursor wird nach dem Ende des Resultsets positioniert. Wenn die erste Zeile des neuen Rowsets nach dem Ende des Resultsets liegt, gibt SQLFetchScroll SQL_NO_DATA zurück. |
CurrRowsetStart | Die Nummer der ersten Zeile im aktuellen Rowset. |
LastResultRow | Die Nummer der letzten Zeile im Resultset. |
RowsetSize | Die Rowsetgröße. |
FetchOffset | Der Wert des FetchOffset-Arguments . |
BookmarkRow | Die Zeile, die dem Lesezeichen entspricht, das durch das Attribut SQL_ATTR_FETCH_BOOKMARK_PTR-Anweisung angegeben wird. |
SQL_FETCH_NEXT
Es gelten die folgenden Regeln.
Bedingung | Erste Zeile des neuen Rowsets |
---|---|
Vor dem Start | 1 |
CurrRowsetStart + RowsetSize[1] <= LastResultRow | CurrRowsetStart + RowsetSize[1] |
CurrRowsetStart + RowsetSize[1]> LastResultRow | Nach Dem Ende |
Nach Dem Ende | Nach Dem Ende |
[1] Wenn die Rowsetgröße seit dem vorherigen Aufruf zum Abrufen von Zeilen geändert wurde, ist dies die Rowsetgröße, die beim vorherigen Aufruf verwendet wurde.
SQL_FETCH_PRIOR
Es gelten die folgenden Regeln.
Bedingung | Erste Zeile des neuen Rowsets |
---|---|
Vor dem Start | Vor dem Start |
CurrRowsetStart = 1 | Vor dem Start |
1 < CurrRowsetStart <= RowsetSize[2] | 1[1] |
CurrRowsetStart > RowsetSize[2] | CurrRowsetStart – RowsetSize[2] |
Nach Ende UND LastResultRow < RowsetSize[2] | 1[1] |
After end AND LastResultRow >= RowsetSize[2] | LastResultRow – RowsetSize + 1[2] |
[1] SQLFetchScroll gibt SQLSTATE 01S06 (Versucht zu abrufen, bevor das Resultset das erste Rowset zurückgegeben hat) und SQL_SUCCESS_WITH_INFO zurück.
[2] Wenn die Rowsetgröße seit dem vorherigen Aufruf zum Abrufen von Zeilen geändert wurde, ist dies die neue Rowsetgröße.
SQL_FETCH_RELATIVE
Es gelten die folgenden Regeln.
Bedingung | Erste Zeile des neuen Rowsets |
---|---|
(Vor Start UND FetchOffset > 0) ODER (Nach Ende UND FetchOffset < 0) | --[1] |
BeforeStart AND FetchOffset <= 0 | Vor dem Start |
CurrRowsetStart = 1 UND FetchOffset < 0 | Vor dem Start |
CurrRowsetStart > 1 UND CurrRowsetStart + FetchOffset < 1 AND | FetchOffset | > RowsetSize[3] | Vor dem Start |
CurrRowsetStart > 1 UND CurrRowsetStart + FetchOffset < 1 AND | FetchOffset | <= RowsetSize[3] | 1[2] |
1 <= CurrRowsetStart + FetchOffset <= LastResultRow | CurrRowsetStart + FetchOffset |
CurrRowsetStart + FetchOffset > LastResultRow | Nach Dem Ende |
Nach Ende UND FetchOffset >= 0 | Nach Dem Ende |
[1] SQLFetchScroll gibt dasselbe Rowset zurück, als wäre es aufgerufen, wenn FetchOrientation auf SQL_FETCH_ABSOLUTE festgelegt wurde. Weitere Informationen finden Sie im Abschnitt "SQL_FETCH_ABSOLUTE".
[2] SQLFetchScroll gibt SQLSTATE 01S06 (Versucht, abzurufen, bevor das Resultset das erste Rowset zurückgegeben hat) und SQL_SUCCESS_WITH_INFO zurück.
[3] Wenn die Rowsetgröße seit dem vorherigen Aufruf zum Abrufen von Zeilen geändert wurde, ist dies die neue Rowsetgröße.
SQL_FETCH_ABSOLUTE
Es gelten die folgenden Regeln.
Bedingung | Erste Zeile des neuen Rowsets |
---|---|
FetchOffset < 0 AND | FetchOffset | <= LastResultRow | LastResultRow + FetchOffset + 1 |
FetchOffset < 0 AND | FetchOffset | > LastResultRow AND | FetchOffset | > RowsetSize[2] | Vor dem Start |
FetchOffset < 0 AND | FetchOffset | > LastResultRow AND | FetchOffset | <= RowsetSize[2] | 1[1] |
FetchOffset = 0 | Vor dem Start |
1 <= FetchOffset <= LastResultRow | FetchOffset |
FetchOffset > LastResultRow | Nach Dem Ende |
[1] SQLFetchScroll gibt SQLSTATE 01S06 (Versucht, abzurufen, bevor das Resultset das erste Rowset zurückgegeben hat) und SQL_SUCCESS_WITH_INFO zurück.
[2] Wenn die Rowsetgröße seit dem vorherigen Aufruf zum Abrufen von Zeilen geändert wurde, ist dies die neue Rowsetgröße.
Ein absoluter Abruf, der für einen dynamischen Cursor ausgeführt wird, kann das erforderliche Ergebnis nicht liefern, da Zeilenpositionen in einem dynamischen Cursor unbestimmt sind. Ein solcher Vorgang entspricht einem Fetch zuerst, gefolgt von einem Fetch-Relativen. es handelt sich nicht um eine atomische Operation, da es sich um einen absoluten Abruf auf einem statischen Cursor handelt.
SQL_FETCH_FIRST
Es gelten die folgenden Regeln.
Bedingung | Erste Zeile des neuen Rowsets |
---|---|
Alle | 1 |
SQL_FETCH_LAST
Es gelten die folgenden Regeln.
Bedingung | Erste Zeile des neuen Rowsets |
---|---|
RowsetSize[1]<= LastResultRow | LastResultRow – RowsetSize + 1[1] |
RowsetSize[1]> LastResultRow | 1 |
[1] Wenn die Rowsetgröße seit dem vorherigen Aufruf zum Abrufen von Zeilen geändert wurde, ist dies die neue Rowsetgröße.
SQL_FETCH_BOOKMARK
Es gelten die folgenden Regeln.
Bedingung | Erste Zeile des neuen Rowsets |
---|---|
BookmarkRow + FetchOffset < 1 | Vor dem Start |
1 <= BookmarkRow + FetchOffset <= LastResultRow | BookmarkRow + FetchOffset |
BookmarkRow + FetchOffset > LastResultRow | Nach Dem Ende |
Informationen zu Lesezeichen finden Sie unter Lesezeichen (ODBC).
Auswirkung von gelöschten, hinzugefügten und Fehlerzeilen auf die Cursorbewegung
Statische Cursor und Keyset-gesteuerte Cursor erkennen manchmal Zeilen, die dem Resultset hinzugefügt wurden, und entfernen Zeilen, die aus dem Resultset gelöscht wurden. Durch Aufrufen von SQLGetInfo mit den Optionen SQL_STATIC_CURSOR_ATTRIBUTES2 und SQL_KEYSET_CURSOR_ATTRIBUTES2 und die SQL_CA2_SENSITIVITY_ADDITIONS, SQL_CA2_SENSITIVITY_DELETIONS und SQL_CA2_SENSITIVITY_UPDATES Bitmasken bestimmt eine Anwendung, ob die von einem bestimmten Treiber implementierten Cursor dies tun. Für Treiber, die gelöschte Zeilen erkennen und entfernen können, beschreiben die folgenden Absätze die Auswirkungen dieses Verhaltens. Für Treiber, die gelöschte Zeilen erkennen, aber nicht entfernen können, haben Löschungen keine Auswirkungen auf Cursorbewegungen, und die folgenden Absätze gelten nicht.
Wenn der Cursor Zeilen erkennt, die dem Resultset hinzugefügt wurden, oder die aus dem Resultset gelöschten Zeilen entfernt, scheint es, als ob er diese Änderungen nur erkennt, wenn er Daten abruft. Dies schließt den Fall ein, wenn SQLFetchScroll aufgerufen wird, wobei FetchOrientation auf SQL_FETCH_RELATIVE und FetchOffset auf 0 festgelegt ist, um das gleiche Rowset zu refetchen, aber nicht den Fall, wenn SQLSetPos aufgerufen wird, wobei fOption auf SQL_REFRESH festgelegt ist. Im letzteren Fall werden die Daten in den Rowsetpuffern aktualisiert, aber nicht refetched, und gelöschte Zeilen werden nicht aus dem Resultset entfernt. Wenn also eine Zeile aus dem aktuellen Rowset gelöscht oder in das aktuelle Rowset eingefügt wird, ändert der Cursor die Rowsetpuffer nicht. Stattdessen wird die Änderung erkannt, wenn ein Rowset abgerufen wird, das zuvor die gelöschte Zeile enthält oder jetzt die eingefügte Zeile enthält.
Beispiel:
// 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);
Wenn SQLFetchScroll ein neues Rowset zurückgibt, das eine Position relativ zum aktuellen Rowset hat ( d. h. FetchOrientation ist SQL_FETCH_NEXT, SQL_FETCH_PRIOR oder SQL_FETCH_RELATIVE ), werden beim Berechnen der Startposition des neuen Rowsets keine Änderungen am aktuellen Rowset eingeschlossen. Es enthält jedoch Änderungen außerhalb des aktuellen Rowsets, wenn sie erkannt werden können. Wenn SQLFetchScroll außerdem ein neues Rowset zurückgibt, das unabhängig vom aktuellen Rowset eine Position hat – d. h. FetchOrientation ist SQL_FETCH_FIRST, SQL_FETCH_LAST, SQL_FETCH_ABSOLUTE oder SQL_FETCH_BOOKMARK – enthält es alle Änderungen, die es erkennen kann, auch wenn sie sich im aktuellen Rowset befinden.
Bei der Bestimmung, ob sich neu hinzugefügte Zeilen innerhalb oder außerhalb des aktuellen Rowsets befinden, wird davon ausgegangen, dass ein Teilrowset bei der letzten gültigen Zeile endet. d. h. die letzte Zeile, für die der Zeilenstatus nicht SQL_ROW_NOROW ist. Angenommen, der Cursor kann neu hinzugefügte Zeilen erkennen, das aktuelle Rowset ist ein Teilrowset, die Anwendung fügt neue Zeilen hinzu, und der Cursor fügt diese Zeilen am Ende des Resultsets hinzu. Wenn die Anwendung SQLFetchScroll aufruft, wobei FetchOrientation auf SQL_FETCH_NEXT festgelegt ist, gibt SQLFetchScroll das Rowset ab der ersten neu hinzugefügten Zeile zurück.
Angenommen, das aktuelle Rowset umfasst die Zeilen 21 bis 30, die Rowsetgröße beträgt 10, der Cursor entfernt die aus dem Resultset gelöschten Zeilen, und der Cursor erkennt Zeilen, die dem Resultset hinzugefügt wurden. Die folgende Tabelle zeigt die Zeilen, die SQLFetchScroll in verschiedenen Situationen zurückgibt.
Change | Fetch-Typ | FetchOffset | Neues Rowset[1] |
---|---|---|---|
Zeile 21 löschen | NEXT | 0 | 31 bis 40 |
Zeile 31 löschen | NEXT | 0 | 32 bis 41 |
Zeile zwischen Zeilen 21 und 22 einfügen | NEXT | 0 | 31 bis 40 |
Zeile zwischen Zeilen 30 und 31 einfügen | NEXT | 0 | Eingefügte Zeile, 31 bis 39 |
Zeile 21 löschen | PRIOR | 0 | 11 bis 20 |
Zeile 20 löschen | PRIOR | 0 | 10 bis 19 |
Zeile zwischen Zeilen 21 und 22 einfügen | PRIOR | 0 | 11 bis 20 |
Zeile zwischen Zeilen 20 und 21 einfügen | PRIOR | 0 | 12 bis 20, Zeile eingefügt |
Zeile 21 löschen | RELATIVE | 0 | 22 bis 31[2] |
Zeile 21 löschen | RELATIVE | 1 | 22 bis 31 |
Zeilen zwischen Zeilen 21 und 22 einfügen | RELATIVE | 0 | 21, Zeile eingefügt, 22 bis 29 |
Zeilen zwischen Zeilen 21 und 22 einfügen | RELATIVE | 1 | 22 bis 31 |
Zeile 21 löschen | ABSOLUTE | 21 | 22 bis 31[2] |
Zeile 22 löschen | ABSOLUTE | 21 | 21, 23 bis 31 |
Zeilen zwischen Zeilen 21 und 22 einfügen | ABSOLUTE | 22 | Zeile eingefügt, 22 bis 29 |
[1] Diese Spalte verwendet die Zeilennummern, bevor Zeilen eingefügt oder gelöscht wurden.
[2] In diesem Fall versucht der Cursor, Zeilen ab Zeile 21 zurückzugeben. Da Zeile 21 gelöscht wurde, ist die erste Zeile, die sie zurückgibt, Zeile 22.
Fehlerzeilen (d. h. Zeilen mit dem Status SQL_ROW_ERROR) wirken sich nicht auf die Cursorbewegung aus. Wenn das aktuelle Rowset beispielsweise mit Zeile 11 beginnt und der Status von Zeile 11 SQL_ROW_ERROR ist, gibt der Aufruf von SQLFetchScroll mit FetchOrientation auf SQL_FETCH_RELATIVE und FetchOffset auf 5 das Rowset ab Zeile 16 zurück, genau wie bei SQL_SUCCESS der Status für Zeile 11.
Zurückgeben von Daten in gebundenen Spalten
SQLFetchScroll gibt Daten in gebundenen Spalten auf die gleiche Weise wie SQLFetch zurück. Weitere Informationen finden Sie unter Zurückgeben von Daten in gebundenen Spalten in der SQLFetch-Funktion.
Wenn keine Spalten gebunden sind, gibt SQLFetchScroll keine Daten zurück, aber der Blockcursor wird an die angegebene Position verschoben. Ob Daten aus ungebundenen Spalten eines Blockcursors mit SQLGetData abgerufen werden können, hängt vom Treiber ab. Diese Funktion wird unterstützt, wenn ein Aufruf von SQLGetInfo das SQL_GD_BLOCK Bit für den SQL_GETDATA_EXTENSIONS Informationstyp zurückgibt.
Pufferadressen
SQLFetchScroll verwendet dieselbe Formel, um die Adresse von Daten und Längen-/Indikatorpuffern wie SQLFetch zu bestimmen. Weitere Informationen finden Sie unter "Pufferadressen" in der SQLBindCol-Funktion.
Zeilenstatusarray
SQLFetchScroll legt Werte im Zeilenstatusarray auf die gleiche Weise wie SQLFetch fest. Weitere Informationen finden Sie unter "Zeilenstatusarray" in der SQLFetch-Funktion.
Abgerufener Zeilenpuffer
SQLFetchScroll gibt die Anzahl der Zeilen zurück, die im abgerufenen Zeilenpuffer abgerufen wurden, auf die gleiche Weise wie SQLFetch. Weitere Informationen finden Sie unter "Zeilen abgerufener Puffer" in der SQLFetch-Funktion.
Fehlerbehandlung
Wenn eine Anwendung SQLFetchScroll in einem ODBC 3.x-Treiber aufruft, ruft der Treiber-Manager SQLFetchScroll im Treiber auf. Wenn eine Anwendung SQLFetchScroll in einem ODBC 2.x-Treiber aufruft, ruft der Treiber-Manager SQLExtendedFetch im Treiber auf. Da SQLFetchScroll und SQLExtendedFetch Fehler etwas anders behandeln, sieht die Anwendung ein etwas anderes Fehlerverhalten, wenn sqlFetchScroll in ODBC 2.x- und ODBC 3.x-Treibern aufgerufen wird.
SQLFetchScroll gibt Fehler und Warnungen auf die gleiche Weise wie SQLFetch zurück. Weitere Informationen finden Sie unter "Fehlerbehandlung" in SQLFetch. SQLExtendedFetch gibt Fehler auf die gleiche Weise wie SQLFetch zurück, mit den folgenden Ausnahmen:
Wenn eine Warnung auftritt, die für eine bestimmte Zeile im Rowset gilt, legt SQLExtendedFetch den entsprechenden Eintrag im Zeilenstatusarray auf SQL_ROW_SUCCESS und nicht auf SQL_ROW_SUCCESS_WITH_INFO fest.
Wenn in jeder Zeile im Rowset Fehler auftreten, gibt SQLExtendedFetch SQL_SUCCESS_WITH_INFO und nicht SQL_ERROR zurück.
In jeder Gruppe von Statusdatensätzen, die für eine einzelne Zeile gelten, muss der erste von SQLExtendedFetch zurückgegebene Statusdatensatz SQLSTATE 01S01 (Fehler in Zeile) enthalten. SQLFetchScroll gibt diesen SQLSTATE-Wert nicht zurück. Wenn SQLExtendedFetch keine zusätzlichen SQLSTATEs zurückgeben kann, muss diese SQLSTATE trotzdem zurückgegeben werden.
SQLFetchScroll und Optimistische Parallelität
Wenn ein Cursor eine optimistische Parallelität verwendet , d. h. das Attribut der SQL_ATTR_CONCURRENCY-Anweisung hat den Wert SQL_CONCUR_VALUES oder SQL_CONCUR_ROWVER, aktualisiert SQLFetchScroll die optimistischen Parallelitätswerte, die von der Datenquelle verwendet werden, um zu erkennen, ob sich eine Zeile geändert hat. Dies geschieht immer dann, wenn SQLFetchScroll ein neues Rowset abruft, einschließlich des Refetches des aktuellen Rowsets. (Es wird aufgerufen, wobei FetchOrientation auf SQL_FETCH_RELATIVE und FetchOffset auf 0 festgelegt ist.)
SQLFetchScroll- und ODBC 2.x-Treiber
Wenn eine Anwendung SQLFetchScroll in einem ODBC 2.x-Treiber aufruft, ordnet der Treiber-Manager diesen Aufruf SQLExtendedFetch zu. Es übergibt die folgenden Werte für die Argumente von SQLExtendedFetch.
SQLExtendedFetch-Argument | Wert |
---|---|
StatementHandle | StatementHandle in SQLFetchScroll. |
FetchOrientation | FetchOrientation in SQLFetchScroll. |
FetchOffset | Wenn FetchOrientation nicht SQL_FETCH_BOOKMARK ist, wird der Wert des FetchOffset-Arguments in SQLFetchScroll verwendet. Wenn FetchOrientation SQL_FETCH_BOOKMARK ist, wird der Wert verwendet, der an der adresse gespeichert wird, die durch das SQL_ATTR_FETCH_BOOKMARK_PTR-Anweisungsattribut angegeben wird. |
RowCountPtr | Die Adresse, die durch das Attribut SQL_ATTR_ROWS_FETCHED_PTR-Anweisung angegeben wird. |
RowStatusArray | Die Adresse, die durch das Attribut SQL_ATTR_ROW_STATUS_PTR-Anweisung angegeben wird. |
Weitere Informationen finden Sie unter BlockCurs, Scrollable Cursors und Abwärtskompatibilität in Anhang G: Treiberrichtlinien für Abwärtskompatibilität.
Deskriptoren und SQLFetchScroll
SQLFetchScroll interagiert mit Deskriptoren auf die gleiche Weise wie SQLFetch. Weitere Informationen finden Sie im Abschnitt "Deskriptoren und SQLFetchScroll" in der SQLFetch-Funktion.
Codebeispiel
Weitere Informationen finden Sie unter Column-Wise Binding, Row-Wise Binding, Positioned Update and Delete-Anweisungen und Aktualisieren von Zeilen im Rowset mit SQLSetPos.
Verwandte Funktionen
Informationen über | Finden Sie unter |
---|---|
Binden eines Puffers an eine Spalte in einem Resultset | SQLBindCol-Funktion |
Ausführen von Masseneinfügungs-, Aktualisierungs- oder Löschvorgängen | SQLBulkOperations-Funktion |
Abbrechen der Anweisungsverarbeitung | SQLCancel-Funktion |
Zurückgeben von Informationen zu einer Spalte in einem Resultset | SQLDescribeCol-Funktion |
Ausführen einer SQL-Anweisung | SQLExecDirect-Funktion |
Ausführen einer vorbereiteten SQL-Anweisung | SQLExecute-Funktion |
Abrufen einer einzelnen Zeile oder eines Datenblocks in einer vorwärtsgerichteten Richtung | SQLFetch-Funktion |
Schließen des Cursors für die -Anweisung | SQLFreeStmt-Funktion |
Zurückgeben der Anzahl von Resultsetspalten | SQLNumResultCols-Funktion |
Positionieren des Cursors, Aktualisieren von Daten im Rowset oder Aktualisieren oder Löschen von Daten im Resultset | SQLSetPos-Funktion |
Festlegen eines Anweisungsattributs | SQLSetStmtAttr-Funktion |
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für