SQLFetchScroll-funktion

Överensstämmelse
Version introducerad: ODBC 3.0 Standardsefterlevnad: ISO 92

Summary
SQLFetchScroll hämtar den angivna radmängden av data från resultatmängden och returnerar data för alla bundna kolumner. Radmängder kan specificeras på en absolut eller relativ position eller med bokmärke.

När man arbetar med en ODBC 2.x-drivrutin mappar Driver Manager denna funktion till SQLExtendedFetch. För mer information, se Mapping Replacement Functions for Backward Compatibility of Applications.

Syntax

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

Arguments

StatementHandle
[Indata] Instruktionshandtag.

FetchOrientation
[Input]

Typ av apport:

SQL_FETCH_NEXT

SQL_FETCH_PRIOR

SQL_FETCH_FIRST

SQL_FETCH_LAST

SQL_FETCH_ABSOLUTE

SQL_FETCH_RELATIVE

SQL_FETCH_BOOKMARK

För mer information, se "Positionering av markören" i avsnittet "Kommentarer".

FetchOffset
[Input]

Nummer på raden att hämta. Tolkningen av detta argument beror på värdet av FetchOrientation-argumentet . För mer information, se "Positionering av markören" i avsnittet "Kommentarer".

Returns

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

Diagnostics

När SQLFetchScroll returnerar antingen SQL_ERROR eller SQL_SUCCESS_WITH_INFO kan ett associerat SQLSTATE-värde erhållas genom att anropa SQLGetDiagRec med en HandleType av SQL_HANDLE_STMT och en Handle of StatementHandle. Följande tabell listar de SQLSTATE-värden som vanligtvis returneras av SQLFetchScroll och förklarar var och en i kontexten av denna funktion; notationen "(DM)" föregår beskrivningarna av SQLSTATE som returneras av Driver Manager. Returkoden som är associerad med varje SQLSTATE-värde är SQL_ERROR, om inget annat anges. Om ett fel uppstår på en enda kolumn kan SQLGetDiagField anropas med en DiagIdentifier SQL_DIAG_COLUMN_NUMBER för att bestämma vilken kolumn felet inträffade i; och SQLGetDiagField kan anropas med en DiagIdentifier av SQL_DIAG_ROW_NUMBER för att bestämma raden som innehåller den kolumnen.

För alla SQLSTATES som kan returnera SQL_SUCCESS_WITH_INFO eller SQL_ERROR (förutom 01xxx SQLSTATE) returneras SQL_SUCCESS_WITH_INFO om ett fel uppstår på en eller flera, men inte alla, rader i en flerradsoperation, och SQL_ERROR returneras om ett fel uppstår i en enradsoperation.

SQLSTATE Error Beskrivning
01000 Allmän varning Informationsmeddelande för drivrutinsspecifikt. (Funktionen returnerar SQL_SUCCESS_WITH_INFO.)
01004 Strängdata, höger trunkerade Sträng- eller binärdata som returnerades för en kolumn resulterade i trunkering av icke-blanka tecken eller icke-NULL-binärdata. Om det var ett strängvärde trunkerades det korrekt.
01S01 Fel i rad Ett fel uppstod vid hämtning av en eller flera rader.

(Om denna SQLSTATE returneras när en ODBC 3*.x*-applikation arbetar med en ODBC 2*.x*-drivrutin kan den ignoreras.)
01S06 Försök att hämta innan resultatuppsättningen returnerade den första raduppsättningen Den begärda raduppsättningen överlappade början av resultatuppsättningen när FetchOrientation var SQL_FETCH_PRIOR, den aktuella positionen låg bortom första raden och numret på den aktuella raden är mindre än eller lika med raduppsättningens storlek.

Den begärda raduppsättningen överlappade början av resultatuppsättningen när FetchOrientation var SQL_FETCH_PRIOR, den aktuella positionen låg bortom slutet av resultatuppsättningen och raduppsättningens storlek var större än resultatuppsättningens storlek.

Den begärda raduppsättningen överlappade början av resultatuppsättningen när FetchOrientation var SQL_FETCH_RELATIVE, FetchOffset var negativ och det absoluta värdet av FetchOffset var mindre än eller lika med radmängdens storlek.

Den begärda raduppsättningen överlappade början av resultatuppsättningen när FetchOrientation var SQL_FETCH_ABSOLUTE, FetchOffset var negativ och det absoluta värdet av FetchOffset var större än resultatmängdens storlek men mindre än eller lika med radmängdens storlek.

(Funktionen returnerar SQL_SUCCESS_WITH_INFO.)
01S07 Fraktionell trunkering Datan som returnerades för en kolumn var förkortad. För numeriska datatyper förkortades den bråkdelade delen av talet. För tids-, tidsstämpel- och intervalldatatyper som innehåller en tidskomponent förkortades den bråkdelade delen av tiden.

(Funktionen returnerar SQL_SUCCESS_WITH_INFO.)
07006 Attributöverträdelse för begränsad datatyp Datavärdet för en kolumn i resultatuppsättningen kunde inte konverteras till den datatyp som specificerades av TargetType i SQLBindCol.

Kolumn 0 var bunden till en datatyp av SQL_C_BOOKMARK, och attributet SQL_ATTR_USE_BOOKMARKS sats sattes till SQL_UB_VARIABLE.

Kolumn 0 var bunden till datatypen SQL_C_VARBOOKMARK, och attributet SQL_ATTR_USE_BOOKMARKS satsen sattes inte till SQL_UB_VARIABLE.
07009 Ogiltigt deskriptorindex Drivrutinen var en ODBC 2*.x*-drivrutin som inte stödjer SQLExtendedFetch, och ett kolumnnummer som specificerades i bindningen för en kolumn var 0.

Kolumn 0 var bunden, och attributet SQL_ATTR_USE_BOOKMARKS sats sattes till SQL_UB_OFF.
08S01 Kommunikationslänkfel Kommunikationslänken mellan drivrutinen och datakällan som drivrutinen var ansluten till misslyckades innan funktionen slutförde bearbetningen.
22001 Strängdata, höger trunkerade Ett variabelt långt bokmärke som returnerades för en kolumn var avkortat.
22002 Indikatorvariabel krävs men tillhandahålls inte NULL-data hämtades till en kolumn vars StrLen_or_IndPtr satt av SQLBindCol (eller SQL_DESC_INDICATOR_PTR satt av SQLSetDescField eller SQLSetDescRec) var en nullpekare.
22003 Numeriskt värde som ligger utom intervallet Att returnera det numeriska värdet (som numeriskt eller sträng) för en eller flera bundna kolumner skulle ha orsakat att hela (istället för bråkdelad) delen av talet hade trunkerats.

För mer information, se Konvertera data från SQL till C Data Types i Appendix D: Data Types.
22007 Ogiltigt datetime-format En teckenkolumn i resultatuppsättningen var bunden till en datum-, tids- eller tidsstämpelstruktur C, och ett värde i kolumnen var respektive ett ogiltigt datum, tid eller tidsstämpel.
22012 Division med noll Ett värde från ett aritmetiskt uttryck returnerades, vilket resulterade i division med noll.
22015 Intervallfältsspill Att tilldela från en exakt numerisk eller intervall SQL-typ till en intervall C-typ orsakade förlust av betydande siffror i det ledande fältet.

När data hämtades till en intervalltyp C fanns ingen representation av värdet för SQL-typen i intervall C-typen.
22018 Ogiltigt teckenvärde för gjuten specifikation En teckenkolumn i resultatuppsättningen var bunden till en buffert C, och kolumnen innehöll ett tecken för vilket det inte fanns någon representation i buffertens teckenuppsättning.

C-typen var en exakt eller ungefärlig numerisk typ, en date-time eller en intervalldatatyp; kolumnens SQL-typ var en teckendatatyp; och värdet i kolumnen var inte en giltig literal av den bundna typen C.
24000 Ogiltigt markörtillstånd StatementHandle var i ett exekverat tillstånd men ingen resultatuppsättning var kopplad till StatementHandle.
40001 Serialiseringsfel Transaktionen där hämtningen utfördes avslutades för att förhindra deadlock.
40003 Slutförande av instruktion okänd Den associerade anslutningen misslyckades under körningen av den här funktionen och transaktionens tillstånd kan inte fastställas.
HY000 Allmänt fel Ett fel uppstod för vilket det inte fanns någon specifik SQLSTATE och för vilken ingen implementeringsspecifik SQLSTATE definierades. Felmeddelandet som returnerades av SQLGetDiagRec i *MessageText-bufferten beskriver felet och dess orsak.
HY001 Fel vid minnesallokering Drivrutinen kunde inte allokera minne som krävs för körning eller slutförande av funktionen.
HY008 Åtgärden avbröts Asynkron bearbetning aktiverades för StatementHandle. Funktionen anropades och innan körningen slutfördes anropades SQLCancel eller SQLCancelHandleStatementHandle. Sedan anropades funktionen igen på StatementHandle.

Funktionen anropades och innan körningen slutfördes anropades SQLCancel eller SQLCancelHandleStatementHandle från en annan tråd i ett flertrådsprogram.
HY010 Funktionssekvensfel (DM) En asynkront körande funktion anropades för anslutningshandtaget som är associerat med StatementHandle. Denna asynkrona funktion kördes fortfarande när SQLFetchScroll-funktionen anropades.

(DM) SQLExecute, SQLExecDirect eller SQLMoreResults anropades för StatementHandle och returnerades SQL_PARAM_DATA_AVAILABLE. Den här funktionen anropades innan data hämtades för alla strömmade parametrar.

(DM) Den specificerade StatementHandle var inte i ett exekverat tillstånd. Funktionen anropades utan att först anropa SQLExecDirect, SQLExecute eller en katalogfunktion.

(DM) En asynkront körande funktion (inte den här) anropades för StatementHandle och kördes fortfarande när den här funktionen anropades.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations eller SQLSetPos anropades för StatementHandle och returnerades SQL_NEED_DATA. Den här funktionen anropades innan data skickades för alla data-at-execution-parametrar eller kolumner.

(DM) SQLFetch anropades för StatementHandle efter att SQLExtendedFetch anropats och innan SQLFreeStmt med SQL_CLOSE-alternativet anropades.
HY013 Minneshanteringsfel Det gick inte att bearbeta funktionsanropet eftersom det inte gick att komma åt underliggande minnesobjekt, möjligen på grund av minnesbrist.
HY090 Ogiltig sträng- eller buffertlängd Attributet SQL_ATTR_USE_BOOKMARK sattes till SQL_UB_VARIABLE, och kolumn 0 var bunden till en buffert vars längd inte var lika med den maximala längden för bokmärket för denna resultatuppsättning. (Denna längd finns tillgänglig i det SQL_DESC_OCTET_LENGTH fältet i IRD och kan erhållas genom att anropa SQLDescribeCol, SQLColAttribute eller SQLGetDescField.)
HY106 Hämta-typ utanför räckvidd DM) Värdet som specificerades för argumentet FetchOrientation var ogiltigt.

(DM) Argumentet FetchOrientation var SQL_FETCH_BOOKMARK, och attributet SQL_ATTR_USE_BOOKMARKS statement sattes till SQL_UB_OFF.

Värdet på attributet SQL_ATTR_CURSOR_TYPE statement var SQL_CURSOR_FORWARD_ONLY, och värdet på argumentet FetchOrientation var inte SQL_FETCH_NEXT.

Värdet på attributet SQL_ATTR_CURSOR_SCROLLABLE statement var SQL_NONSCROLLABLE, och värdet på argumentet FetchOrientation var inte SQL_FETCH_NEXT.
HY107 Radvärde utanför räckvidden Värdet som specificerades med attributet SQL_ATTR_CURSOR_TYPE statement var SQL_CURSOR_KEYSET_DRIVEN, men värdet som specificerades med attributet SQL_ATTR_KEYSET_SIZE statement var större än 0 och mindre än värdet som specificerades med attributet SQL_ATTR_ROW_ARRAY_SIZE statement.
HY111 Ogiltigt bokmärkesvärde Argumentet FetchOrientation var SQL_FETCH_BOOKMARK, och bokmärket som pekades på av värdet i attributet SQL_ATTR_FETCH_BOOKMARK_PTR statement var inte giltigt eller en nullpekare.
HY117 Anslutningen pausas på grund av okänt transaktionstillstånd. Endast frånkopplings- och skrivskyddade funktioner tillåts. (DM) Mer information om pausat tillstånd finns i SQLEndTran-funktion.
HYC00 Valfri funktion har inte implementerats Drivrutinen eller datakällan stöder inte konverteringen som specificeras av kombinationen av TargetType i SQLBindCol och SQL-datatypen i motsvarande kolumn.
HYT00 Tidsgränsen har upphört att gälla Tidsgränsen för frågan löpte ut innan datakällan returnerade den begärda resultatuppsättningen. Tidsavbrottsperioden sätts via SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 Tidsgränsen för anslutningen gick ut Tidsgränsen för anslutningen löpte ut innan datakällan svarade på begäran. Tidsgränsen för anslutningen anges via SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Drivrutinen stöder inte den här funktionen (DM) Drivrutinen som är associerad med StatementHandle stöder inte funktionen.
IM017 Avsökning är inaktiverat i asynkront meddelandeläge När meddelandemodellen används inaktiveras avsökningen.
IM018 SQLCompleteAsync har inte anropats för att slutföra den tidigare asynkrona åtgärden på det här handtaget. Om det tidigare funktionsanropet på handtaget returnerar SQL_STILL_EXECUTING och om meddelandeläget är aktiverat måste SQLCompleteAsync anropas på handtaget för att utföra efterbearbetningen och slutföra åtgärden.

Comments

SQLFetchScroll returnerar en specificerad radmängd från resultatmängden. Radmängder kan specificeras med absolut eller relativ position eller med bokmärke. SQLFetchScroll kan endast anropas medan en resultatmängd finns – det vill säga efter ett anrop som skapar en resultatmängd och innan markören över den mängden stängs. Om några kolumner är bundna, returnerar den data i dessa kolumner. Om applikationen har specificerat en pekare till en radstatusarray eller en buffert för att returnera antalet rader som hämtats, returnerar SQLFetchScroll även denna information. Anrop till SQLFetchScroll kan blandas med anrop till SQLFetch men kan inte blandas med anrop till SQLExtendedFetch.

För mer information, se Användning av blockmarkörer och användning av rullbara markörer.

Positionering av markören

När resultatuppsättningen skapas placeras markören före början av resultatuppsättningen. SQLFetchScroll positionerar blockmarkören baserat på värdena i argumenten FetchOrientation och FetchOffset, som visas i följande tabell. De exakta reglerna för att bestämma starten på det nya radsetet visas i nästa avsnitt.

FetchOrientation Meaning
SQL_FETCH_NEXT Lämna tillbaka nästa radset. Detta motsvarar att anropa SQLFetch.

SQLFetchScroll ignorerar värdet av FetchOffset.
SQL_FETCH_PRIOR Lämna tillbaka den tidigare raduppsättningen.

SQLFetchScroll ignorerar värdet av FetchOffset.
SQL_FETCH_RELATIVE Returnera raduppsättningen FetchOffset från början av den aktuella raduppsättningen.
SQL_FETCH_ABSOLUTE Returnera raduppsättningen med start vid rad FetchOffset.
SQL_FETCH_FIRST Returnera den första raduppsättningen i resultatuppsättningen.

SQLFetchScroll ignorerar värdet av FetchOffset.
SQL_FETCH_LAST Returnera den sista kompletta raduppsättningen i resultatuppsättningen.

SQLFetchScroll ignorerar värdet av FetchOffset.
SQL_FETCH_BOOKMARK Returnera raderna FetchOffset i radmängden från bokmärket som anges av attributet SQL_ATTR_FETCH_BOOKMARK_PTR-satsen.

Drivrutiner behöver inte stödja alla hämtningsorienteringar; en applikation anropar SQLGetInfo med informationstypen SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 eller SQL_STATIC_CURSOR_ATTRIBUTES1 (beroende på markörens typ) för att avgöra vilka hämtaorienteringar som stöds av drivrutinen. Applikationen bör titta på SQL_CA1_NEXT, SQL_CA1_RELATIVE, SQL_CA1_ABSOLUTE och WQL_CA1_BOOKMARK bitmasker i dessa informationstyper. Dessutom, om markören är endast framåtriktad och FetchOrientation inte är SQL_FETCH_NEXT, returnerar SQLFetchScroll SQLSTATE HY106 (Fetch-typ utanför räckvidd).

Attributet SQL_ATTR_ROW_ARRAY_SIZE anger antalet rader i radmängden. Om raduppsättningen som hämtas av SQLFetchScroll överlappar slutet av resultatmängden, returnerar SQLFetchScroll en partiell raduppsättning. Det vill säga, om S + R - 1 är större än L, där S är startraden i radmängden som hämtas, R är radmängdens storlek och L är den sista raden i resultatmängden, så är endast de första raderna L - S + 1 i radmängden gällande. De återstående raderna är tomma och har statusen SQL_ROW_NOROW.

Efter att SQLFetchScroll återvänder är den aktuella raden den första raden i raduppsättningen.

Regler för markörpositionering

Följande avsnitt beskriver de exakta reglerna för varje värde i FetchOrientation. Dessa regler använder följande notation.

Notation Meaning
Innan start Blockmarkören placeras innan resultatuppsättningen startar. Om den första raden i den nya raduppsättningen är före starten av resultatuppsättningen, returnerar SQLFetchScroll SQL_NO_DATA.
Efter slutet Blockmarkören placeras efter slutet av resultatuppsättningen. Om den första raden i den nya radmängden är efter slutet av resultatmängden, returnerar SQLFetchScroll SQL_NO_DATA.
CurrRowsetStart Numret på den första raden i den aktuella raduppsättningen.
LastResultRow Numret på den sista raden i resultatuppsättningen.
RowsetSize Storleken på radsetet.
FetchOffset Värdet på argumentet FetchOffset.
BookmarkRow Raden som motsvarar bokmärket specificerat av attributet SQL_ATTR_FETCH_BOOKMARK_PTR sats.

SQL_FETCH_NEXT

Följande regler gäller.

Tillstånd Första raden av ny raduppsättning
Innan start 1
CurrRowsetStart + RowsetSize[1] <= LastResultRow CurrRowsetStart + RowsetSize[1]
CurrRowsetStart + RowsetSize[1]> LastResultRow Efter slutet
Efter slutet Efter slutet

[1] Om raduppsättningsstorleken har ändrats sedan föregående anrop för att hämta rader, är detta raduppsättningsstorleken som användes med föregående anrop.

SQL_FETCH_PRIOR

Följande regler gäller.

Tillstånd Första raden av ny raduppsättning
Innan start Innan start
CurrRowsetStart = 1 Innan start
1 < CurrRowsetStart <= RowsetSize[2] 1[1]
CurrRowsetStart > RowsetSize[2] CurrRowsetStart - RowsetSize[2]
After end OCH LastResultRow < RowsetSize[2] 1[1]
Efter slut OCH LastResultRow >= RowsetSize[2] LastResultRow - RowsetSize + 1[2]

[1] SQLFetchScroll returnerar SQLSTATE 01S06 (Försök att hämta innan resultatuppsättningen returnerade den första raduppsättningen) och SQL_SUCCESS_WITH_INFO.

[2] Om raduppsättningsstorleken har ändrats sedan föregående anrop för att hämta rader, är detta den nya raduppsättningsstorleken.

SQL_FETCH_RELATIVE

Följande regler gäller.

Tillstånd Första raden av ny raduppsättning
(Före start OCH FetchOffset > 0) ELLER (After end OCH FetchOffset < 0) -- [1]
BeforeStart OCH FetchOffset <= 0 Innan start
CurrRowsetStart = 1 OCH FetchOffset < 0 Innan start
CurrRowsetStart > 1 OCH CurrRowsetStart + FetchOffset < 1 OCH | FetchOffset | > RowsetSize[3] Innan start
CurrRowsetStart > 1 OCH CurrRowsetStart + FetchOffset < 1 OCH | FetchOffset | <= RowsetSize[3] 1[2]
1 <= CurrRowsetStart + FetchOffset <= LastResultRow CurrRowsetStart + FetchOffset
CurrRowsetStart + FetchOffset > LastResultRow Efter slutet
Efter slut OCH FetchOffset >= 0 Efter slutet

[1] SQLFetchScroll returnerar samma radmängd som om den anropades med FetchOrientation satt till SQL_FETCH_ABSOLUTE. För mer information, se avsnittet "SQL_FETCH_ABSOLUTE".

[2] SQLFetchScroll returnerar SQLSTATE 01S06 (Försök att hämta innan resultatuppsättningen returnerade den första raduppsättningen) och SQL_SUCCESS_WITH_INFO.

[3] Om raduppsättningsstorleken har ändrats sedan föregående anrop för att hämta rader, är detta den nya raduppsättningsstorleken.

SQL_FETCH_ABSOLUTE

Följande regler gäller.

Tillstånd Första raden av ny raduppsättning
FetchOffset < 0 OCH | FetchOffset | <= LastResultRow LastResultRow + FetchOffset + 1
FetchOffset < 0 OCH | FetchOffset | > LastResultRow OCH | FetchOffset | > RowsetSize[2] Innan start
FetchOffset < 0 OCH | FetchOffset | > LastResultRow OCH | FetchOffset | <= RowsetSize[2] 1[1]
FetchOffset = 0 Innan start
1 <= FetchOffset <= LastResultRow FetchOffset
FetchOffset > LastResultRow Efter slutet

[1] SQLFetchScroll returnerar SQLSTATE 01S06 (Försök att hämta innan resultatuppsättningen returnerade den första raduppsättningen) och SQL_SUCCESS_WITH_INFO.

[2] Om raduppsättningsstorleken har ändrats sedan föregående anrop för att hämta rader, är detta den nya raduppsättningsstorleken.

En absolut hämtning utförd mot en dynamisk markör kan inte ge det önskade resultatet eftersom radpositionerna i en dynamisk markör är obestämda. En sådan operation är ekvivalent med en hämta först följt av en hämta-relativ; det är inte en atomär operation, som en absolut hämtning på en statisk markör.

SQL_FETCH_FIRST

Följande regler gäller.

Tillstånd Första raden av ny raduppsättning
Vilken som helst 1

SQL_FETCH_LAST

Följande regler gäller.

Tillstånd Första raden av ny raduppsättning
RowsetSize[1]<= LastResultRow LastResultRow - RowsetSize + 1[1]
RowsetSize[1]> LastResultRow 1

[1] Om raduppsättningsstorleken har ändrats sedan föregående anrop för att hämta rader, är detta den nya raduppsättningsstorleken.

SQL_FETCH_BOOKMARK

Följande regler gäller.

Tillstånd Första raden av ny raduppsättning
BookmarkRow + FetchOffset < 1 Innan start
1 <= BookmarkRow + FetchOffset <= LastResultRow BookmarkRow + FetchOffset
BookmarkRow + FetchOffset > LastResultRow Efter slutet

För information om bokmärken, se Bokmärken (ODBC).

Effekten av raderade rader som tagits bort, till och felet påverkar markörens rörelse

Statiska och tangentsatsstyrda markörer upptäcker ibland rader som lagts till i resultatuppsättningen och tar bort rader som tagits bort från resultatuppsättningen. Genom att anropa SQLGetInfo med SQL_STATIC_CURSOR_ATTRIBUTES2- och SQL_KEYSET_CURSOR_ATTRIBUTES2-alternativen och titta på SQL_CA2_SENSITIVITY_ADDITIONS, SQL_CA2_SENSITIVITY_DELETIONS och SQL_CA2_SENSITIVITY_UPDATES bitmasker, avgör en applikation om markörerna som implementeras av en viss drivrutin gör detta. För drivrutiner som kan upptäcka raderade rader och ta bort dem, beskriver följande stycken effekterna av detta beteende. För drivrutiner som kan upptäcka raderade rader men inte kan ta bort dem, har raderingar ingen effekt på markörrörelser, och följande stycken gäller inte.

Om markören upptäcker rader som lagts till i resultatuppsättningen eller tar bort rader som tagits bort från resultatuppsättningen, verkar det som om den bara upptäcker dessa ändringar när den hämtar data. Detta inkluderar fallet när SQLFetchScroll anropas med FetchOrientation satt till SQL_FETCH_RELATIVE och FetchOffset satt till 0 för att repetcha samma raduppsättning, men inkluderar inte fallet när SQLSetPos anropas med fOption satt till SQL_REFRESH. I det senare fallet uppdateras datan i raduppsättningsbuffertarna, men inte rehämtas, och raderade rader tas inte bort från resultatuppsättningen. Således, när en rad raderas från eller infogas i den aktuella raduppsättningen, ändrar inte markören raduppsättningens buffertar. Istället känner den av ändringen när den hämtar en raduppsättning som tidigare inkluderade den raderade raden eller nu inkluderar den insatta raden.

Ett exempel:

// 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);  

När SQLFetchScroll returnerar en ny raduppsättning som har en position relativt den aktuella radmängden – det vill säga FetchOrientation är SQL_FETCH_NEXT, SQL_FETCH_PRIOR eller SQL_FETCH_RELATIVE – inkluderar den inte ändringar i den aktuella radmängden när startpositionen för den nya radmängden beräknas. Den inkluderar dock ändringar utanför den aktuella raduppsättningen om den kan upptäcka dem. Dessutom, när SQLFetchScroll returnerar en ny radmängd som har en position oberoende av den aktuella raduppsättningen – det vill säga FetchOrientation är SQL_FETCH_FIRST, SQL_FETCH_LAST, SQL_FETCH_ABSOLUTE eller SQL_FETCH_BOOKMARK – inkluderar den alla ändringar den kan upptäcka, även om de finns i den aktuella raduppsättningen.

När man avgör om nyligen tillagda rader ligger inom eller utanför den aktuella radmängden anses en partiell radmängd sluta vid den sista giltiga raden; det vill säga den sista raden för vilken radstatusen inte är SQL_ROW_NOROW. Till exempel, anta att markören kan upptäcka nyligen tillagda rader, den aktuella raduppsättningen är en delvis raduppsättning, applikationen lägger till nya rader och markören lägger till dessa rader i slutet av resultatuppsättningen. Om applikationen anropar SQLFetchScroll med FetchOrientation inställt på SQL_FETCH_NEXT, returnerar SQLFetchScroll raduppsättningen som börjar med den första nyligen tillagda raden.

Till exempel, anta att den aktuella raduppsättningen består av raderna 21 till 30, raduppsättningens storlek är 10, markören tar bort rader som tagits bort från resultatuppsättningen, och markören känner av rader som lagts till i resultatuppsättningen. Följande tabell visar raderna som SQLFetchScroll returnerar i olika situationer.

Change Hämtatyp FetchOffset Nytt radset[1]
Radera rad 21 NÄSTA 0 31 till 40
Radera rad 31 NÄSTA 0 32 till 41
Sätt in rad mellan rad 21 och 22 NÄSTA 0 31 till 40
Sätt in rad mellan rad 30 och 31 NÄSTA 0 Inlagd rad, 31 till 39
Radera rad 21 PRIOR 0 11 till 20
Ta bort rad 20 PRIOR 0 10 till 19
Sätt in rad mellan rad 21 och 22 PRIOR 0 11 till 20
Sätt in rad mellan rad 20 och 21 PRIOR 0 12 till 20, inlagd rad
Radera rad 21 SLÄKTING 0 22 till 31[2]
Radera rad 21 SLÄKTING 1 22 till 31
Sätt in rad mellan rad 21 och 22 SLÄKTING 0 21, insatt rad, 22 till 29
Sätt in rad mellan rad 21 och 22 SLÄKTING 1 22 till 31
Radera rad 21 ABSOLUTE 21 22 till 31[2]
Radera rad 22 ABSOLUTE 21 21, 23 till 31
Sätt in rad mellan rad 21 och 22 ABSOLUTE 22 Insatta raden, 22 till 29

[1] Denna kolumn använder radnumren innan några rader sattes in eller togs bort.

[2] I detta fall försöker markören returnera rader som börjar med rad 21. Eftersom rad 21 har tagits bort är den första raden den returnerar rad 22.

Felrader (det vill säga rader med status SQL_ROW_ERROR) påverkar inte markörens rörelse. Till exempel, om den aktuella raduppsättningen börjar med rad 11 och status för rad 11 är SQL_ROW_ERROR, returnerar anrop av SQLFetchScroll med FetchOrientation satt till SQL_FETCH_RELATIVE och FetchOffset satt till 5 raduppsättningen som börjar med rad 16, precis som om statusen för rad 11 var SQL_SUCCESS.

Returnera data i bundna kolumner

SQLFetchScroll returnerar data i bundna kolumner på samma sätt som SQLFetch. För mer information, se "Returning Data in Bound Columns" i SQLFetch Function.

Om inga kolumner är begränsade returnerar SQLFetchScroll inte data men flyttar blockmarkören till den angivna positionen. Om data kan hämtas från obundna kolumner i en blockmarkör med SQLGetData beror på drivrutinen. Denna funktion stöds om ett anrop till SQLGetInfo returnerar SQL_GD_BLOCK bit för SQL_GETDATA_EXTENSIONS informationstyp.

Buffertadresser

SQLFetchScroll använder samma formel för att bestämma adressen till data och längd-/indikatorbuffertar som SQLFetch. För mer information, se "Buffer Addresses" i SQLBindCol Function.

Radstatusmatris

SQLFetchScroll sätter värden i radstatusarrayen på samma sätt som SQLFetch. För mer information, se "Row Status Array" i SQLFetch Function.

Buffert för rader hämtade

SQLFetchScroll returnerar antalet rader hämtade i den raderhämtade bufferten på samma sätt som SQLFetch. För mer information, se "Rows Fetched Buffer" i SQLFetch Function.

Felhantering

När en applikation anropar SQLFetchScroll i en ODBC 3.x-drivrutin, anropar Driver Manager SQLFetchScroll i drivrutinen. När en applikation anropar SQLFetchScroll i en ODBC 2.x-drivrutin, anropar Driver Manager SQLExtendedFetch i drivrutinen. Eftersom SQLFetchScroll och SQLExtendedFetch hanterar fel på något olika sätt, ser applikationen något olika felbeteende när den anropar SQLFetchScroll i ODBC 2.x och ODBC 3.x-drivrutiner.

SQLFetchScroll returnerar fel och varningar på samma sätt som SQLFetch; för mer information, se "Error Handling" i SQLFetch. SQLExtendedFetch returnerar fel på samma sätt som SQLFetch, med följande undantag:

När en varning uppstår som gäller en viss rad i raduppsättningen, sätter SQLExtendedFetch motsvarande post i radstatusarrayen till SQL_ROW_SUCCESS, inte SQL_ROW_SUCCESS_WITH_INFO.

Om fel uppstår i varje rad i radmängden returnerar SQLExtendedFetch SQL_SUCCESS_WITH_INFO, inte SQL_ERROR.

I varje grupp av statusposter som gäller för en enskild rad måste den första statusposten som returneras av SQLExtendedFetch innehålla SQLSTATE 01S01 (Fel i rad); SQLFetchScroll returnerar inte detta SQLSTATE. Om SQLExtendedFetch inte kan returnera ytterligare SQLSTATE måste den ändå returnera denna SQLSTATE.

SQLFetchScroll och optimistisk samtidighet

Om en markör använder optimistisk samtidighet – det vill säga att attributet SQL_ATTR_CONCURRENCY statement har värdet SQL_CONCUR_VALUES eller SQL_CONCUR_ROWVER – uppdaterar SQLFetchScroll de optimistiska samtidighetsvärden som används av datakällan för att upptäcka om en rad har ändrats. Detta händer varje gång SQLFetchScroll hämtar en ny raduppsättning, inklusive när den reletar den aktuella raduppsättningen. (Den anropas med FetchOrientation satt till SQL_FETCH_RELATIVE och FetchOffset satt till 0.)

SQLFetchScroll och ODBC 2.x-drivrutiner

När en applikation anropar SQLFetchScroll i en ODBC 2.x-drivrutin, mappar Driver Manager detta anrop till SQLExtendedFetch. Den skickar följande värden för argumenten i SQLExtendedFetch.

SQLExtendedFetch-argumentet Value
StatementHandle StatementHandle i SQLFetchScroll.
FetchOrientation FetchOrientation i SQLFetchScroll.
FetchOffset Om FetchOrientation inte är SQL_FETCH_BOOKMARK används värdet av argumentet FetchOffset i SQLFetchScroll .

Om FetchOrientation är SQL_FETCH_BOOKMARK används värdet som lagras vid adressen som anges av attributet SQL_ATTR_FETCH_BOOKMARK_PTR-satsen.
RowCountPtr Adressen som anges av attributet SQL_ATTR_ROWS_FETCHED_PTR statement.
RowStatusArray Adressen som anges av attributet SQL_ATTR_ROW_STATUS_PTR statement.

Mer information finns i Blockera markörer, rullningsbara markörer och Bakåtkompatibilitet i bilaga G: Drivrutinsriktlinjer för bakåtkompatibilitet.

Beskrivningar och SQLFetchScroll

SQLFetchScroll interagerar med deskriptorer på samma sätt som SQLFetch. För mer information, se avsnittet "Descriptors and SQLFetchScroll" i SQLFetch Function.

Kodexempel

Se Column-Wise Binding, Row-Wise Binding, Positioned Update and Delete-satser samt Uppdatering av rader i raduppsättningen med SQLSetPos.

Mer information om Se
Binda en buffert till en kolumn i en resultatuppsättning SQLBindCol-funktion
Utför massinsättningar, uppdateringar eller borttagningsoperationer SQLBulkOperations-funktionen
Avbryta instruktionsbearbetning SQLCancel-funktion
Returnerar information om en kolumn i en resultatmängd SQLDescribeCol-funktionen
Exekvering av en SQL-sats SQLExecDirect-funktionen
Köra en förberedd SQL-instruktion SQLExecute-funktion
Att hämta en enda rad eller ett datablock i en framåtriktad riktning SQLFetch-funktion
Stänger markören på påståendet SQLFreeStmt-funktion
Returnerar antalet resultatuppsättningskolumner SQLNumResultCols-funktionen
Positionering av markören, uppdatering av data i raduppsättningen eller uppdatering eller borttagning av data i resultatuppsättningen SQLSetPos-funktionen
Ange ett instruktionsattribut SQLSetStmtAttr-funktion