Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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:
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.
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.
Converteert de gegevens naar het type dat is opgegeven door TargetType in SQLBindCol.
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.
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.
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.
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.
Verwante functies
| 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 |