Delen via


SQLFetch-functie

conformance
Versie geïntroduceerd: NALEVING van ODBC 1.0-standaarden: ISO 92

Samenvatting
SQLFetch haalt de volgende rijenset met gegevens op uit de resultatenset en retourneert gegevens voor alle afhankelijke kolommen.

Syntaxis

  
SQLRETURN SQLFetch(  
     SQLHSTMT     StatementHandle);  

Argumenten

StatementHandle-
[Invoer] Instructiehandgreep.

Retouren

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

Diagnostiek

Wanneer SQLFetch SQL_ERROR of SQL_SUCCESS_WITH_INFO retourneert, kan een bijbehorende SQLSTATE-waarde worden verkregen door de SQLGetDiagRec-functie aan te roepen met een HandleType van SQL_HANDLE_STMT en een Handle of StatementHandle. De volgende tabel bevat de SQLSTATE-waarden die doorgaans worden geretourneerd door SQLFetch en legt elk uit in de context van deze functie; de notatie (DM)' voorafgaat aan de beschrijvingen van SQLSTATEs die worden geretourneerd door Driver Manager. De retourcode die is gekoppeld aan elke SQLSTATE-waarde is SQL_ERROR, tenzij anders vermeld. Als er een fout optreedt in één kolom, kan SQLGetDiagField worden aangeroepen met een DiagIdentifier van SQL_DIAG_COLUMN_NUMBER om de kolom te bepalen waarop de fout is opgetreden; en SQLGetDiagField kunnen worden aangeroepen met een DiagIdentifier van SQL_DIAG_ROW_NUMBER om de rij te bepalen die die kolom bevat.

Voor al die SQLSTATEs die SQL_SUCCESS_WITH_INFO of SQL_ERROR (behalve 01xxx SQLSTATEs) kunnen retourneren, wordt SQL_SUCCESS_WITH_INFO geretourneerd als er een fout optreedt in een of meer, maar niet alle rijen van een multirow-bewerking en SQL_ERROR wordt geretourneerd als er een fout optreedt bij een bewerking met één rij.

SQLSTATE Fout Beschrijving
01000 Algemene waarschuwing Stuurprogrammaspecifiek informatiebericht. (Functie retourneert SQL_SUCCESS_WITH_INFO.)
01004 Tekenreeksgegevens, rechts afgekapt Tekenreeks- of binaire gegevens die worden geretourneerd voor een kolom, hebben geresulteerd in het afkappen van niet-lege tekens of niet-NULL binaire gegevens. Als het een tekenreekswaarde was, is deze rechts afgekapt.
01S01 Fout in rij Er is een fout opgetreden tijdens het ophalen van een of meer rijen.

(Als deze SQLSTATE wordt geretourneerd wanneer een ODBC 3*.x*-toepassing werkt met een ODBC 2*.x*-stuurprogramma, kan deze worden genegeerd.)
01S07 Breukafkapping De geretourneerde gegevens voor een kolom zijn afgekapt. Voor numerieke gegevenstypen is het breukgedeelte van het getal afgekapt. Voor tijd-, tijdstempel- en intervalgegevenstypen die een tijdonderdeel bevatten, is het breukgedeelte van de tijd afgekapt.

(Functie retourneert SQL_SUCCESS_WITH_INFO.)
07006 Schending van kenmerk van beperkt gegevenstype De gegevenswaarde van een kolom in de resultatenset kan niet worden geconverteerd naar het gegevenstype dat is opgegeven door TargetType in SQLBindCol.

Kolom 0 is gebonden aan een gegevenstype van SQL_C_BOOKMARK en het kenmerk SQL_ATTR_USE_BOOKMARKS instructie is ingesteld op SQL_UB_VARIABLE.

Kolom 0 is gebonden aan een gegevenstype van SQL_C_VARBOOKMARK en het kenmerk SQL_ATTR_USE_BOOKMARKS instructie is niet ingesteld op SQL_UB_VARIABLE.
07009 Ongeldige descriptorindex Het stuurprogramma was een ODBC 2*.x*-stuurprogramma dat GEEN ondersteuning biedt voor SQLExtendedFetch en een kolomnummer dat is opgegeven in de binding voor een kolom 0.

Kolom 0 is gebonden en het kenmerk SQL_ATTR_USE_BOOKMARKS instructie is ingesteld op SQL_UB_OFF.
08S01 Communicatiekoppelingsfout De communicatiekoppeling tussen het stuurprogramma en de gegevensbron waarmee het stuurprogramma is verbonden, is mislukt voordat de verwerking van de functie is voltooid.
22001 Tekenreeksgegevens, rechts afgekapt Een bladwijzer met de lengte van een variabele die wordt geretourneerd voor een kolom, is afgekapt.
22002 Indicatorvariabele vereist, maar niet opgegeven NULL-gegevens zijn opgehaald in een kolom waarvan StrLen_or_IndPtr ingesteld door SQLBindCol (of SQL_DESC_INDICATOR_PTR ingesteld door SQLSetDescField of SQLSetDescRec) een null-aanwijzer was.
22003 Numerieke waarde buiten het bereik Als u de numerieke waarde als numerieke waarde of tekenreeks voor een of meer afhankelijke kolommen retourneert, wordt het gehele gedeelte (in tegenstelling tot breuken) van het getal afgekapt.

Zie Gegevens converteren van SQL naar C-gegevenstypen in bijlage D: gegevenstypen voor meer informatie.
22007 Ongeldige datum/tijd-notatie Een tekenkolom in de resultatenset is gebonden aan een datum-, tijd- of tijdstempel-C-structuur en een waarde in de kolom was respectievelijk een ongeldige datum, tijd of tijdstempel.
22012 Delen door nul Er is een waarde van een rekenkundige expressie geretourneerd, wat heeft geresulteerd in delen door nul.
22015 Intervalveldoverloop Het toewijzen van een exact numeriek of interval-SQL-type aan een interval C-type heeft een verlies van significante cijfers in het voorloopveld veroorzaakt.

Bij het ophalen van gegevens naar een interval C-type, was er geen weergave van de waarde van het SQL-type in het interval C-type.
22018 Ongeldige tekenwaarde voor cast-specificatie Een tekenkolom in de resultatenset is gebonden aan een teken C-buffer en de kolom bevat een teken waarvoor de tekenset van de buffer niet werd weergegeven.

Het C-type was een exacte of geschatte numerieke waarde, een datum/tijd of een gegevenstype interval; het SQL-type van de kolom was een gegevenstype voor tekens; en de waarde in de kolom was geen geldige letterlijke waarde van het afhankelijke C-type.
24000 Ongeldige cursorstatus De StatementHandle heeft een uitgevoerde status, maar er is geen resultatenset gekoppeld aan de StatementHandle.
40001 Serialisatiefout De transactie waarin het ophalen is uitgevoerd, is beëindigd om impasse te voorkomen.
40003 Voltooiing van instructie onbekend De gekoppelde verbinding is mislukt tijdens de uitvoering van deze functie en de status van de transactie kan niet worden bepaald.
HY000 Algemene fout Er is een fout opgetreden waarvoor er geen specifieke SQLSTATE is en waarvoor geen implementatiespecifieke SQLSTATE is gedefinieerd. Het foutbericht dat is geretourneerd door SQLGetDiagRec- in de *MessageText buffer beschrijft de fout en de oorzaak ervan.
HY001 Fout bij geheugentoewijzing Het stuurprogramma kan geen geheugen toewijzen dat vereist is om de uitvoering of voltooiing van de functie te ondersteunen.
HY008 Bewerking geannuleerd Asynchrone verwerking is ingeschakeld voor de StatementHandle-. De functie SQLFetch is aangeroepen en voordat de uitvoering is voltooid, werd SQLCancel of SQLCancelHandle aangeroepen op de StatementHandle. Vervolgens werd de functie SQLFetch opnieuw aangeroepen op de StatementHandle.

Of de sqlFetch-functie werd aangeroepen en voordat de uitvoering werd voltooid, werd SQLCancel of SQLCancelHandle aangeroepen vanuit een andere thread in een multithread-toepassing.
HY010 Fout in functiereeks (DM) Er is een asynchroon uitgevoerde functie aangeroepen voor de verbindingsgreep die is gekoppeld aan de StatementHandle-. Deze asynchrone functie werd nog steeds uitgevoerd toen de SQLFetch-functie werd aangeroepen.

(DM) SQLExecute, SQLExecDirectof SQLMoreResults is aangeroepen voor de StatementHandle- en SQL_PARAM_DATA_AVAILABLE geretourneerd. Deze functie is aangeroepen voordat gegevens zijn opgehaald voor alle gestreamde parameters.

(DM) De opgegeven StatementHandle- heeft geen uitgevoerde status. De functie is aangeroepen zonder eerst SQLExecDirectaan te roepen, SQLExecute of een catalogusfunctie.

(DM) Een asynchroon uitgevoerde functie (niet deze) is aangeroepen voor de StatementHandle- en werd nog steeds uitgevoerd toen deze functie werd aangeroepen.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperationsof SQLSetPos is aangeroepen voor de StatementHandle- en SQL_NEED_DATA geretourneerd. Deze functie is aangeroepen voordat gegevens werden verzonden voor alle parameters of kolommen voor uitvoering van gegevens.

(DM) SQLFetch werd aangeroepen voor de StatementHandle nadat SQLExtendedFetch werd aangeroepen en voordat SQLFreeStmt met de SQL_CLOSE-optie werd aangeroepen.
HY013 Fout bij geheugenbeheer De functie-aanroep kan niet worden verwerkt omdat de onderliggende geheugenobjecten niet kunnen worden geopend, mogelijk vanwege weinig geheugen.
HY090 Ongeldige tekenreeks- of bufferlengte Het kenmerk SQL_ATTR_USE_BOOKMARK instructie is ingesteld op SQL_UB_VARIABLE en kolom 0 is gebonden aan een buffer waarvan de lengte niet gelijk is aan de maximumlengte voor de bladwijzer voor deze resultatenset. (Deze lengte is beschikbaar in het SQL_DESC_OCTET_LENGTH veld van de IRD en kan worden verkregen door SQLDescribeCol, SQLColAttribute of SQLGetDescField aan te roepen.)
HY107 Rijwaarde buiten bereik De waarde die is opgegeven met het kenmerk SQL_ATTR_CURSOR_TYPE instructie, is SQL_CURSOR_KEYSET_DRIVEN, maar de waarde die is opgegeven met het kenmerk SQL_ATTR_KEYSET_SIZE instructie is groter dan 0 en kleiner dan de waarde die is opgegeven met het kenmerk SQL_ATTR_ROW_ARRAY_SIZE instructie.
HY117 De verbinding is onderbroken vanwege een onbekende transactiestatus. Alleen de verbinding verbreken en alleen-lezenfuncties zijn toegestaan. (DM) Zie SQLEndTran Functionvoor meer informatie over de onderbroken status.
HYC00 Optionele functie niet geïmplementeerd Het stuurprogramma of de gegevensbron biedt geen ondersteuning voor de conversie die is opgegeven door de combinatie van het TargetType in SQLBindCol en het SQL-gegevenstype van de bijbehorende kolom.
HYT00 Time-out verlopen De time-outperiode van de query is verlopen voordat de gegevensbron de aangevraagde resultatenset heeft geretourneerd. De time-outperiode wordt ingesteld via SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 Time-out voor de verbinding is overschreden De time-outperiode voor de verbinding is verlopen voordat de gegevensbron op de aanvraag heeft gereageerd. De time-outperiode voor de verbinding wordt ingesteld via SQLSetConnectAttr-, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Stuurprogramma biedt geen ondersteuning voor deze functie (DM) Het stuurprogramma dat is gekoppeld aan de StatementHandle- biedt geen ondersteuning voor de functie.
IM017 Polling is uitgeschakeld in de asynchrone meldingsmodus Wanneer het meldingsmodel wordt gebruikt, wordt polling uitgeschakeld.
IM018 SQLCompleteAsync- is niet aangeroepen om de vorige asynchrone bewerking op deze ingang te voltooien. Als de vorige functieaanroep op de ingang SQL_STILL_EXECUTING retourneert en als de meldingsmodus is ingeschakeld, moet SQLCompleteAsync- worden aangeroepen op de ingang om de bewerking na verwerking uit te voeren en de bewerking te voltooien.

Opmerkingen

SQLFetch retourneert de volgende rijenset in de resultatenset. Deze kan alleen worden aangeroepen zolang er een resultatenset bestaat: dat wil gezegd, na een aanroep die een resultatenset maakt en voordat de cursor over die resultatenset wordt gesloten. Als er kolommen afhankelijk zijn, worden de gegevens in die kolommen geretourneerd. Als de toepassing een aanwijzer heeft opgegeven voor een rijstatusmatrix of een buffer waarin het aantal opgehaalde rijen moet worden geretourneerd, retourneert SQLFetch ook deze informatie. Aanroepen naar SQLFetch kunnen worden gemengd met aanroepen naar SQLFetchScroll , maar kunnen niet worden gemengd met aanroepen naar SQLExtendedFetch. Zie Een rij met gegevens ophalen voor meer informatie.

Als een ODBC 3*.x*-toepassing werkt met een ODBC 2*.x*-stuurprogramma, wijst Driver Manager SQLFetch-aanroepen toe aan SQLExtendedFetch voor een ODBC 2*.x*-stuurprogramma dat ONDERSTEUNING biedt voor SQLExtendedFetch. Als het ODBC 2*.x*-stuurprogramma SQLExtendedFetch niet ondersteunt, wijst Driver Manager SQLFetch-aanroepen toe aan SQLFetch in het ODBC 2*.x*-stuurprogramma, waardoor slechts één rij kan worden opgehaald.

Zie Voor meer informatie blokcursors, schuifbare cursors en compatibiliteit met eerdere versies in bijlage G: stuurprogrammarichtlijnen voor compatibiliteit met eerdere versies.

De cursor plaatsen

Wanneer de resultatenset wordt gemaakt, wordt de cursor vóór het begin van de resultatenset geplaatst. SQLFetch haalt de volgende rijenset op. Het is gelijk aan het aanroepen van SQLFetchScroll met FetchOrientation ingesteld op SQL_FETCH_NEXT. Zie Cursors en Cursors blokkeren voor meer informatie over cursors.

Het kenmerk SQL_ATTR_ROW_ARRAY_SIZE instructie geeft het aantal rijen in de rijenset op. Als de rijenset die wordt opgehaald door SQLFetch het einde van de resultatenset overlapt, retourneert SQLFetch een gedeeltelijke rijenset. Als S + R - 1 groter is dan L, waarbij S de beginrij is van de rijenset die wordt opgehaald, is R de grootte van de rijenset en L de laatste rij in de resultatenset, zijn alleen de eerste L - S + 1 rijen van de rijenset geldig. De resterende rijen zijn leeg en hebben een status van SQL_ROW_NOROW.

Nadat SQLFetch is geretourneerd, is de huidige rij de eerste rij van de rijenset.

De regels in de volgende tabel beschrijven cursorpositie na een aanroep naar SQLFetch, op basis van de voorwaarden in de tweede tabel in deze sectie.

Conditie Eerste rij met nieuwe rijenset
Voordat u begint 1
CurrRowsetStart<= LastResultRow - RowsetSize[1] CurrRowsetStart + RowsetSize[2]
CurrRowsetStart>LastResultRow - RowsetSize[1] Na einde
Na einde Na einde

[1] Als de grootte van de rijenset wordt gewijzigd tussen ophalen, is dit de grootte van de rijenset die is gebruikt bij het vorige ophalen.

[2] Als de grootte van de rijenset wordt gewijzigd tussen ophalen, is dit de grootte van de rijenset die is gebruikt met de nieuwe ophaalbewerking.

Notatie Betekenis
Voordat u begint De blokcursor wordt vóór het begin van de resultatenset geplaatst. Als de eerste rij van de nieuwe rijenset vóór het begin van de resultatenset valt, retourneert SQLFetch SQL_NO_DATA.
Na einde De blokcursor wordt geplaatst na het einde van de resultatenset. Als de eerste rij van de nieuwe rijenset na het einde van de resultatenset valt, retourneert SQLFetch SQL_NO_DATA.
CurrRowsetStart Het nummer van de eerste rij in de huidige rijenset.
LastResultRow Het nummer van de laatste rij in de resultatenset.
Rijensetsize De grootte van de rijenset.

Stel dat een resultatenset 100 rijen heeft en dat de grootte van de rijenset 5 is. In de volgende tabel ziet u de rijenset en retourcode die door SQLFetch wordt geretourneerd voor verschillende beginposities.

Huidige rijset Retourcode Nieuwe rijenset Aantal opgehaalde rijen
Voordat u begint SQL_SUCCESS 1 tot 5 5
1 tot 5 SQL_SUCCESS 6 tot 10 5
52 tot 56 SQL_SUCCESS 57 tot 61 5
91 tot 95 SQL_SUCCESS 96 tot 100 5
93 tot 97 SQL_SUCCESS 98 tot 100. Rijen 4 en 5 van de rijstatusmatrix worden ingesteld op SQL_ROW_NOROW. 3
96 tot 100 SQL_NO_DATA Geen. 0
99 tot 100 SQL_NO_DATA Geen. 0
Na einde SQL_NO_DATA Geen. 0

Gegevens retourneren in afhankelijke kolommen

Omdat SQLFetch elke rij retourneert, worden de gegevens voor elke afhankelijke kolom in de buffer aan die kolom gekoppeld. Als er geen kolommen zijn gebonden, retourneert SQLFetch geen gegevens, maar verplaatst de blokcursor wel vooruit. De gegevens kunnen nog steeds worden opgehaald met behulp van SQLGetData. Als de cursor een multirow cursor is (dat wil gezegd, de SQL_ATTR_ROW_ARRAY_SIZE groter is dan 1), kan SQLGetData alleen worden aangeroepen als SQL_GD_BLOCK wordt geretourneerd wanneer SQLGetInfo wordt aangeroepen met een InfoType van SQL_GETDATA_EXTENSIONS. (Zie SQLGetData voor meer informatie.)

Voor elke afhankelijke kolom in een rij doet SQLFetch het volgende:

  1. Hiermee stelt u de lengte/indicatorbuffer in op SQL_NULL_DATA en gaat u naar de volgende kolom als de gegevens NULL zijn. Als de gegevens NULL zijn en er geen lengte/indicatorbuffer is gebonden, retourneert SQLFetch SQLSTATE 22002 (indicatorvariabele vereist maar niet opgegeven) voor de rij en gaat naar de volgende rij. Zie Bufferadressen in SQLBindCol voor informatie over het bepalen van het adres van de lengte/indicatorbuffer.

    Als de gegevens voor de kolom niet NULL zijn, gaat SQLFetch verder met stap 2.

  2. Als het kenmerk SQL_ATTR_MAX_LENGTH instructie is ingesteld op een niet-nulwaarde en de kolom teken- of binaire gegevens bevat, worden de gegevens afgekapt tot SQL_ATTR_MAX_LENGTH bytes.

    Opmerking

    Het kenmerk SQL_ATTR_MAX_LENGTH instructie is bedoeld om het netwerkverkeer te verminderen. Deze wordt over het algemeen geïmplementeerd door de gegevensbron, waarmee de gegevens worden afgekapt voordat deze via het netwerk worden geretourneerd. Stuurprogramma's en gegevensbronnen zijn niet vereist om deze te ondersteunen. Om ervoor te zorgen dat gegevens worden afgekapt tot een bepaalde grootte, moet een toepassing een buffer van die grootte toewijzen en de grootte opgeven in het argument cbValueMax in SQLBindCol.

  3. Converteert de gegevens naar het type dat is opgegeven door TargetType in SQLBindCol.

  4. Als de gegevens zijn geconverteerd naar een gegevenstype met variabele lengte, zoals teken of binair, controleert SQLFetch of de lengte van de gegevens groter is dan de lengte van de gegevensbuffer. Als de lengte van tekengegevens (inclusief het teken null-beëindiging) groter is dan de lengte van de gegevensbuffer, kapt SQLFetch de gegevens af tot de lengte van de gegevensbuffer, minder lengte van een null-beëindigingsteken. Vervolgens worden de gegevens door null beëindigd. Als de lengte van binaire gegevens de lengte van de gegevensbuffer overschrijdt, kapt SQLFetch deze af tot de lengte van de gegevensbuffer. De lengte van de gegevensbuffer wordt opgegeven met BufferLength in SQLBindCol.

    SQLFetch kapt nooit gegevens af die zijn geconverteerd naar gegevenstypen met een vaste lengte; er wordt altijd van uitgegaan dat de lengte van de gegevensbuffer de grootte van het gegevenstype is.

  5. Hiermee worden de geconverteerde (en mogelijk afgekapte) gegevens in de gegevensbuffer geplaatst. Zie Bufferadressen in SQLBindCol voor informatie over het bepalen van het adres van de gegevensbuffer.

  6. Hiermee wordt de lengte van de gegevens in de lengte/indicatorbuffer geplaatst. Als de indicatorpointer en de lengtepointer beide zijn ingesteld op dezelfde buffer (zoals een aanroep naar SQLBindCol wel), wordt de lengte in de buffer geschreven voor geldige gegevens en SQL_NULL_DATA in de buffer voor NULL-gegevens wordt geschreven. Als er geen lengte-/indicatorbuffer is gebonden, retourneert SQLFetch de lengte niet.

    • Voor teken- of binaire gegevens is dit de lengte van de gegevens na conversie en vóór afkapping omdat de gegevensbuffer te klein is. Als het stuurprogramma de lengte van de gegevens na conversie niet kan bepalen, zoals soms het geval is bij lange gegevens, wordt de lengte ingesteld op SQL_NO_TOTAL. Als gegevens zijn afgekapt vanwege het kenmerk SQL_ATTR_MAX_LENGTH instructie, wordt de waarde van dit kenmerk in de lengte/indicatorbuffer geplaatst in plaats van de werkelijke lengte. Dit komt doordat dit kenmerk is ontworpen voor het afkappen van gegevens op de server vóór de conversie, zodat het stuurprogramma geen manier heeft om uit te zoeken wat de werkelijke lengte is.

    • Voor alle andere gegevenstypen is dit de lengte van de gegevens na conversie; Dat wil gezegd, het is de grootte van het type waarnaar de gegevens zijn geconverteerd.

    Zie Bufferadressen in SQLBindCol voor informatie over het bepalen van het adres van de lengte/indicatorbuffer.

  7. Als de gegevens worden afgekapt tijdens de conversie zonder verlies van significante cijfers (bijvoorbeeld het reële getal 1,234 wordt afgekapt tot het gehele getal 1 wanneer ze worden geconverteerd), retourneert SQLFetch SQLSTATE 01S07 (fractionele afkapping) en SQL_SUCCESS_WITH_INFO. Als de gegevens worden afgekapt omdat de lengte van de gegevensbuffer te klein is (de tekenreeks 'abcdef' wordt bijvoorbeeld in een buffer van 4 bytes geplaatst), retourneert SQLFetch SQLSTATE 01004 (gegevens afgekapt) en SQL_SUCCESS_WITH_INFO. Als gegevens worden afgekapt vanwege het kenmerk van de SQL_ATTR_MAX_LENGTH-instructie, retourneert SQLFetch SQL_SUCCESS en retourneert SQLSTATE 01S07 (fractionele afkapping) of SQLSTATE 01004 (gegevens afgekapt). Als gegevens worden afgekapt tijdens de conversie met een verlies van significante cijfers (bijvoorbeeld als een SQL_INTEGER waarde groter dan 100.000 is geconverteerd naar een SQL_C_TINYINT), retourneert SQLFetch SQLSTATE 22003 (numerieke waarde buiten het bereik) en SQL_ERROR (als de grootte van de rijset 1 is) of SQL_SUCCESS_WITH_INFO (als de rijset groter is dan 1).

De inhoud van de afhankelijke gegevensbuffer en de lengte/indicatorbuffer zijn niet gedefinieerd als SQLFetch of SQLFetchScroll geen SQL_SUCCESS of SQL_SUCCESS_WITH_INFO retourneert.

Rijstatusmatrix

De matrix rijstatus wordt gebruikt om de status van elke rij in de rijenset te retourneren. Het adres van deze matrix wordt opgegeven met het kenmerk SQL_ATTR_ROW_STATUS_PTR instructie. De matrix wordt toegewezen door de toepassing en moet zoveel elementen bevatten als die zijn opgegeven door het kenmerk SQL_ATTR_ROW_ARRAY_SIZE instructie. De waarden worden ingesteld door SQLFetch, SQLFetchScroll en SQLBulkOperations of SQLSetPos (behalve wanneer ze zijn aangeroepen nadat de cursor is geplaatst door SQLExtendedFetch). Als de waarde van het kenmerk SQL_ATTR_ROW_STATUS_PTR instructie een null-aanwijzer is, retourneren deze functies niet de rijstatus.

De inhoud van de matrixbuffer rijstatus is niet gedefinieerd als SQLFetch of SQLFetchScroll geen SQL_SUCCESS of SQL_SUCCESS_WITH_INFO retourneert.

De volgende waarden worden geretourneerd in de rijstatusmatrix.

Matrixwaarde rijstatus Beschrijving
SQL_ROW_SUCCESS De rij is opgehaald en is niet gewijzigd sinds deze voor het laatst is opgehaald uit deze resultatenset.
SQL_ROW_SUCCESS_WITH_INFO De rij is opgehaald en is niet gewijzigd sinds deze voor het laatst is opgehaald uit deze resultatenset. Er is echter een waarschuwing geretourneerd over de rij.
SQL_ROW_ERROR Er is een fout opgetreden tijdens het ophalen van de rij.
SQL_ROW_UPDATED[1],[2] en [3] De rij is opgehaald en is gewijzigd sinds deze voor het laatst is opgehaald uit deze resultatenset. Als de rij opnieuw wordt opgehaald uit deze resultatenset of wordt vernieuwd door SQLSetPos, wordt de status gewijzigd in de nieuwe status van de rij.
SQL_ROW_DELETED[3] De rij is verwijderd sinds deze voor het laatst is opgehaald uit deze resultatenset.
SQL_ROW_ADDED[4] De rij is ingevoegd door SQLBulkOperations. Als de rij opnieuw wordt opgehaald uit deze resultatenset of wordt vernieuwd door SQLSetPos, is de status SQL_ROW_SUCCESS.
SQL_ROW_NOROW De rijenset overlapte het einde van de resultatenset en er is geen rij geretourneerd die overeenkomt met dit element van de rijstatusmatrix.

[1] Voor sleutelsets, gemengde en dynamische cursors, als een sleutelwaarde wordt bijgewerkt, wordt de rij met gegevens als verwijderd beschouwd en wordt er een nieuwe rij toegevoegd.

[2] Sommige stuurprogramma's kunnen geen updates voor gegevens detecteren en kunnen daarom deze waarde niet retourneren. Een toepassing roept SQLGetInfo aan met de optie SQL_ROW_UPDATES om te bepalen of een stuurprogramma updates voor verwende rijen kan detecteren.

[3] SQLFetch kan deze waarde alleen retourneren wanneer deze is gemengd met aanroepen naar SQLFetchScroll. Dit komt doordat SQLFetch vooruitgaat door de resultatenset en wanneer deze uitsluitend wordt gebruikt, geen rijen verklinkt. Omdat er geen rijen worden verwed, detecteert SQLFetch geen wijzigingen die zijn aangebracht in eerder opgehaalde rijen. Als SQLFetchScroll echter de cursor plaatst voordat eerder opgehaalde rijen worden gebruikt en SQLFetch wordt gebruikt om deze rijen op te halen, kan SQLFetch eventuele wijzigingen in deze rijen detecteren.

[4] Alleen geretourneerd door SQLBulkOperations. Niet ingesteld door SQLFetch of SQLFetchScroll.

Opgehaalde rijen buffer

De opgehaalde rijen worden gebruikt om het aantal opgehaalde rijen te retourneren, inclusief rijen waarvoor geen gegevens zijn geretourneerd omdat er een fout is opgetreden tijdens het ophalen. Met andere woorden, het is het aantal rijen waarvoor de waarde in de rijstatusmatrix niet SQL_ROW_NOROW is. Het adres van deze buffer wordt opgegeven met het kenmerk SQL_ATTR_ROWS_FETCHED_PTR instructie. De buffer wordt toegewezen door de toepassing. Het is ingesteld door SQLFetch en SQLFetchScroll. Als de waarde van het kenmerk SQL_ATTR_ROWS_FETCHED_PTR instructie een null-aanwijzer is, retourneren deze functies niet het aantal opgehaalde rijen. Om het nummer van de huidige rij in de resultatenset te bepalen, kan een toepassing SQLGetStmtAttr aanroepen met het kenmerk SQL_ATTR_ROW_NUMBER.

De inhoud van de opgehaalde buffer voor rijen is niet gedefinieerd als SQLFetch of SQLFetchScroll geen SQL_SUCCESS of SQL_SUCCESS_WITH_INFO retourneert, behalve wanneer SQL_NO_DATA wordt geretourneerd. In dat geval is de waarde in de opgehaalde buffer voor rijen ingesteld op 0.

Foutafhandeling

Fouten en waarschuwingen kunnen van toepassing zijn op afzonderlijke rijen of op de hele functie. Zie Diagnostics en SQLGetDiagField voor meer informatie over diagnostische records.

Fouten en waarschuwingen voor de hele functie

Als een fout van toepassing is op de hele functie, zoals SQLSTATE HYT00 (time-out verlopen) of SQLSTATE 24000 (ongeldige cursorstatus), retourneert SQLFetch SQL_ERROR en de toepasselijke SQLSTATE. De inhoud van de rijensetbuffers is niet gedefinieerd en de cursorpositie is ongewijzigd.

Als een waarschuwing van toepassing is op de hele functie, retourneert SQLFetch SQL_SUCCESS_WITH_INFO en de toepasselijke SQLSTATE. De statusrecords voor waarschuwingen die van toepassing zijn op de hele functie, worden geretourneerd vóór de statusrecords die van toepassing zijn op afzonderlijke rijen.

Fouten en waarschuwingen in afzonderlijke rijen

Als een fout (zoals SQLSTATE 22012 (Delen door nul)) of een waarschuwing (zoals SQLSTATE 01004 (gegevens afgekapt)) van toepassing is op één rij, doet SQLFetch het volgende:

  • Hiermee stelt u het bijbehorende element van de rijstatusmatrix in op SQL_ROW_ERROR op fouten of SQL_ROW_SUCCESS_WITH_INFO voor waarschuwingen.

  • Voegt nul of meer statusrecords toe die SQLSTATEs bevatten voor de fout of waarschuwing.

  • Hiermee stelt u de rij- en kolomnummervelden in de statusrecords in. Als SQLFetch een rij- of kolomnummer niet kan bepalen, wordt dat getal respectievelijk ingesteld op SQL_ROW_NUMBER_UNKNOWN of SQL_COLUMN_NUMBER_UNKNOWN. Als de statusrecord niet van toepassing is op een bepaalde kolom, stelt SQLFetch het kolomnummer in op SQL_NO_COLUMN_NUMBER.

SQLFetch blijft rijen ophalen totdat alle rijen in de rijenset zijn opgehaald. Het retourneert SQL_SUCCESS_WITH_INFO, tenzij er een fout optreedt in elke rij van de rijenset (niet inclusief rijen met status SQL_ROW_NOROW), in welk geval het SQL_ERROR retourneert. Met name als de grootte van de rijenset 1 is en er een fout optreedt in die rij, retourneert SQLFetch SQL_ERROR.

SQLFetch retourneert de statusrecords in rijnummervolgorde. Dat wil gezegd, het retourneert alle statusrecords voor onbekende rijen (indien aanwezig); vervolgens worden alle statusrecords voor de eerste rij (indien aanwezig) geretourneerd, waarna alle statusrecords voor de tweede rij (indien van toepassing) worden geretourneerd, enzovoort. De statusrecords voor elke rij worden geordend volgens de normale regels voor het ordenen van statusrecords; Zie 'Reeks statusrecords' in SQLGetDiagField voor meer informatie.

Descriptors en SQLFetch

In de volgende secties wordt beschreven hoe SQLFetch communiceert met descriptors.

Argumenttoewijzingen

Het stuurprogramma stelt geen descriptorvelden in op basis van de argumenten van SQLFetch.

Andere descriptorvelden

De volgende descriptorvelden worden gebruikt door SQLFetch.

Descriptorveld Desc. Veld in Instellen via
SQL_DESC_ARRAY_SIZE ARD koptekst kenmerk SQL_ATTR_ROW_ARRAY_SIZE instructie
SQL_DESC_ARRAY_STATUS_PTR IRD koptekst kenmerk SQL_ATTR_ROW_STATUS_PTR instructie
SQL_DESC_BIND_OFFSET_PTR ARD koptekst kenmerk SQL_ATTR_ROW_BIND_OFFSET_PTR instructie
SQL_DESC_BIND_TYPE ARD koptekst kenmerk SQL_ATTR_ROW_BIND_TYPE instructie
SQL_DESC_COUNT ARD koptekst ColumnNumber-argument van SQLBindCol
SQL_DESC_DATA_PTR ARD archief TargetValuePtr-argument van SQLBindCol
SQL_DESC_INDICATOR_PTR ARD archief StrLen_or_IndPtr argument in SQLBindCol
SQL_DESC_OCTET_LENGTH ARD archief BufferLength-argument in SQLBindCol
SQL_DESC_OCTET_LENGTH_PTR ARD archief StrLen_or_IndPtr argument in SQLBindCol
SQL_DESC_ROWS_PROCESSED_PTR IRD koptekst kenmerk SQL_ATTR_ROWS_FETCHED_PTR instructie
SQL_DESC_TYPE ARD archief Argument TargetType in SQLBindCol

Alle descriptorvelden kunnen ook worden ingesteld via SQLSetDescField.

Afzonderlijke lengte- en indicatorbuffers

Toepassingen kunnen één buffer of twee afzonderlijke buffers binden die kunnen worden gebruikt voor het opslaan van lengte- en indicatorwaarden. Wanneer een toepassing SQLBindCol aanroept, stelt het stuurprogramma de velden SQL_DESC_OCTET_LENGTH_PTR en SQL_DESC_INDICATOR_PTR van de ARD in op hetzelfde adres, dat wordt doorgegeven in het argument StrLen_or_IndPtr . Wanneer een toepassing SQLSetDescField of SQLSetDescRec aanroept, kunnen deze twee velden worden ingesteld op verschillende adressen.

SQLFetch bepaalt of de toepassing afzonderlijke lengte- en indicatorbuffers heeft opgegeven. In dit geval stelt SQLFetch , wanneer de gegevens niet NULL zijn, de indicatorbuffer in op 0 en retourneert de lengte in de lengtebuffer. Wanneer de gegevens NULL zijn, stelt SQLFetch de indicatorbuffer in op SQL_NULL_DATA en wordt de lengtebuffer niet gewijzigd.

Codevoorbeeld

Zie SQLBindCol, SQLColumns, SQLGetData en SQLProcedures.

Voor informatie over Zien!
Een buffer koppelen aan een kolom in een resultatenset SQLBindCol-functie
Verwerking van instructie annuleren SQLCancel Function-
Informatie retourneren over een kolom in een resultatenset SQLDescribeCol-functie
Een SQL-instructie uitvoeren SQLExecDirect-functie
Een voorbereide SQL-instructie uitvoeren SQLExecute-functie
Een gegevensblok ophalen of door een resultatenset schuiven SQLFetchScroll-functie
De cursor op de instructie sluiten SQLFreeStmt, functie
Een deel of alle gegevenskolommen ophalen SQLGetData, functie
Het aantal kolommen in de resultatenset retourneren SQLNumResultCols, functie
Een instructie voorbereiden voor uitvoering SQLPrepare, functie

Zie ook

ODBC-API-verwijzing
ODBC-headerbestanden