SQLGetData-funktion
Efterlevnad
Version introducerad: ODBC 1.0 Standardefterlevnad: ISO 92
Sammanfattning
SQLGetData hämtar data för en enda kolumn i resultatuppsättningen eller för en enskild parameter efter att SQLParamData returnerar SQL_PARAM_DATA_AVAILABLE. Det kan anropas flera gånger för att hämta data med variabel längd i delar.
Syntax
SQLRETURN SQLGetData(
SQLHSTMT StatementHandle,
SQLUSMALLINT Col_or_Param_Num,
SQLSMALLINT TargetType,
SQLPOINTER TargetValuePtr,
SQLLEN BufferLength,
SQLLEN * StrLen_or_IndPtr);
Argument
StatementHandle
[Indata] Instruktionshandtag.
Col_or_Param_Num
[Indata] För att hämta kolumndata är det numret på den kolumn som data ska returneras för. Resultatuppsättningskolumner numreras i ökande kolumnordning från och med 1. Bokmärkeskolumnen är kolumnnummer 0. Detta kan endast anges om bokmärken är aktiverade.
För att hämta parameterdata är det ordningstalet för parametern, som börjar vid 1.
TargetType
[Indata] Typidentifieraren för C-datatypen för bufferten *TargetValuePtr. En lista över giltiga C-datatyper och typidentifierare finns i avsnittet C-datatyper i bilaga D: Datatyper.
Om TargetType- är SQL_ARD_TYPE använder drivrutinen den typidentifierare som anges i fältet SQL_DESC_CONCISE_TYPE i ARD. Om TargetType- är SQL_APD_TYPE använder SQLGetData samma C-datatyp som angavs i SQLBindParameter. Annars åsidosätter C-datatypen som anges i SQLGetData den C-datatyp som anges i SQLBindParameter. Om det är SQL_C_DEFAULT väljer drivrutinen C-standarddatatypen baserat på källans SQL-datatyp.
Du kan också ange en utökad C-datatyp. Mer information finns i C-datatyper i ODBC.
TargetValuePtr
[Utdata] Pekare till bufferten där data ska returneras.
TargetValuePtr får inte vara NULL.
BufferLength
[Indata] Längden på *TargetValuePtr buffert i byte.
Drivrutinen använder BufferLength för att undvika att skriva förbi slutet av *TargetValuePtr buffert när du returnerar data med variabel längd, till exempel tecken eller binära data. Observera att drivrutinen räknar null-avslutningstecknet när teckendata returneras till *TargetValuePtr. * TargetValuePtr måste därför innehålla utrymme för null-avslutningstecknet, annars trunkerar drivrutinen data.
När drivrutinen returnerar data med fast längd, till exempel ett heltal eller en datumstruktur, ignorerar drivrutinen BufferLength- och förutsätter att bufferten är tillräckligt stor för att lagra data. Det är därför viktigt att programmet allokerar en tillräckligt stor buffert för data med fast längd, annars skriver drivrutinen förbi buffertens slut.
SQLGetData- returnerar SQLSTATE HY090 (Ogiltig sträng- eller buffertlängd) när BufferLength är mindre än 0 men inte när BufferLength är 0.
StrLen_or_IndPtr
[Utdata] Pekare till bufferten där längden eller indikatorvärdet ska returneras. Om det här är en null-pekare returneras ingen längd eller indikatorvärde. Detta returnerar ett fel när data som hämtas är NULL.
SQLGetData- kan returnera följande värden i längden/indikatorbufferten:
Längden på de tillgängliga data som ska returneras
SQL_NO_TOTAL
SQL_NULL_DATA
Mer information finns i Använda längd-/indikatorvärden och "Kommentarer" i det här avsnittet.
Returnerar
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_STILL_EXECUTING, SQL_ERROR eller SQL_INVALID_HANDLE.
Diagnostik
När SQLGetData- returnerar antingen SQL_ERROR eller SQL_SUCCESS_WITH_INFO kan du hämta ett associerat SQLSTATE-värde genom att anropa SQLGetDiagRec- med en HandleType- av SQL_HANDLE_STMT och en Hantera av StatementHandle. I följande tabell visas de SQLSTATE-värden som ofta returneras av SQLGetData- och förklarar var och en i kontexten för den här funktionen. notationen "(DM)" föregår beskrivningarna av SQLSTATEs som returneras av Driver Manager. Returkoden som är associerad med varje SQLSTATE-värde är SQL_ERROR, om inget annat anges.
SQLSTATE | Fel | Beskrivning |
---|---|---|
01000 | Allmän varning | Informationsmeddelande för drivrutinsspecifikt. (Funktionen returnerar SQL_SUCCESS_WITH_INFO.) |
01004 | Strängdata, höger trunkerade | Det gick inte att hämta alla data för den angivna kolumnen Col_or_Param_Numi ett enda anrop till funktionen. SQL_NO_TOTAL eller längden på de data som finns kvar i den angivna kolumnen innan det aktuella anropet till SQLGetData- returneras i *StrLen_or_IndPtr. (Funktionen returnerar SQL_SUCCESS_WITH_INFO.) Mer information om hur du använder flera anrop för att SQLGetData för en enda kolumn finns i "Kommentarer". |
01S07 | Fraktionell trunkering | Data som returnerades för en eller flera kolumner trunkerades. För numeriska datatyper trunkerades bråkdelen av talet. För tids-, tidsstämpel- och intervalldatatyper som innehåller en tidskomponent trunkerades bråkdelen 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 kan inte konverteras till den C-datatyp som anges av argumentet TargetType. |
07009 | Ogiltigt deskriptorindex | Värdet som angavs för argumentet Col_or_Param_Num var 0 och SQL_ATTR_USE_BOOKMARKS-instruktionsattributet angavs till SQL_UB_OFF. Värdet som angavs för argumentet Col_or_Param_Num var större än antalet kolumner i resultatuppsättningen. Det Col_or_Param_Num värdet var inte lika med ordningstalet för parametern som är tillgänglig. (DM) Den angivna kolumnen var bunden. Den här beskrivningen gäller inte för drivrutiner som returnerar SQL_GD_BOUND bitmask för alternativet SQL_GETDATA_EXTENSIONS i SQLGetInfo-. (DM) Antalet för den angivna kolumnen var mindre än eller lika med antalet för den högsta bundna kolumnen. Den här beskrivningen gäller inte för drivrutiner som returnerar SQL_GD_ANY_COLUMN bitmask för alternativet SQL_GETDATA_EXTENSIONS i SQLGetInfo. (DM) Programmet har redan anropat SQLGetData för den aktuella raden. numret på kolumnen som angavs i det aktuella anropet var mindre än antalet för kolumnen som angavs i föregående anrop. och drivrutinen returnerar inte SQL_GD_ANY_ORDER bitmask för alternativet SQL_GETDATA_EXTENSIONS i SQLGetInfo. (DM) Argumentet TargetType var SQL_ARD_TYPE och Col_or_Param_Num-beskrivningsposten i ARD misslyckades med konsekvenskontrollen. (DM) Argumentet TargetType var SQL_ARD_TYPE och värdet i fältet SQL_DESC_COUNT i ARD var mindre än argumentet Col_or_Param_Num. |
08S01 | Kommunikationslänkfel | Kommunikationslänken mellan drivrutinen och datakällan som drivrutinen var ansluten till misslyckades innan funktionen slutförde bearbetningen. |
22002 | Indikatorvariabel krävs men tillhandahålls inte | StrLen_or_IndPtr var en null-pekare och NULL-data hämtades. |
22003 | Numeriskt värde som ligger utom intervallet | Om du returnerade det numeriska värdet (som numeriskt eller sträng) för kolumnen skulle hela delen (i stället för bråk) av talet trunkeras. Mer information finns i bilaga D: Datatyper. |
22007 | Ogiltigt datetime-format | Teckenkolumnen i resultatuppsättningen var bunden till en struktur för C-datum, tid eller tidsstämpel, och värdet i kolumnen var ett ogiltigt datum, tid eller tidsstämpel. Mer information finns i bilaga D: Datatyper. |
22012 | Division med noll | Ett värde från ett aritmetiskt uttryck som resulterade i division med noll returnerades. |
22015 | Intervallfältsspill | Tilldelning från en exakt numerisk sql-typ eller intervall-SQL-typ till en intervall C-typ orsakade en förlust av betydande siffror i det inledande fältet. När du returnerade data till en intervall C-typ fanns det 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 returnerades till en C-buffert och kolumnen innehöll ett tecken som det inte fanns någon representation för i buffertens teckenuppsättning. C-typen var en exakt eller ungefärlig numerisk, en datetime eller en intervalldatatyp. SQL-typen för kolumnen var en teckendatatyp. och värdet i kolumnen var inte en giltig literal av den bundna C-typen. |
24000 | Ogiltigt markörtillstånd | (DM) Funktionen anropades utan att först anropa SQLFetch eller SQLFetchScroll för att placera markören på den datarad som krävs. (DM) StatementHandle- var i ett kört tillstånd, men ingen resultatuppsättning var associerad med StatementHandle-. En markör var öppen på StatementHandle och SQLFetch eller SQLFetchScroll hade anropats, men markören placerades innan resultatuppsättningen startade eller efter slutet av resultatuppsättningen. |
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 bufferten MessageText beskriver felet och orsaken. |
HY001 | Fel vid minnesallokering | Drivrutinen kunde inte allokera minne som krävs för körning eller slutförande av funktionen. |
HY003 | Programtypen ligger inte inom intervallet | (DM) Argumentet TargetType inte var en giltig datatyp, SQL_C_DEFAULT, SQL_ARD_TYPE (vid hämtning av kolumndata) eller SQL_APD_TYPE (vid hämtning av parameterdata). (DM) Argumentet Col_or_Param_Num var 0 och argumentet TargetType inte var SQL_C_BOOKMARK för ett bokmärke med fast längd eller SQL_C_VARBOOKMARK för ett bokmärke med variabel längd. |
HY008 | Åtgärden avbröts | Asynkron bearbetning aktiverades för StatementHandle-. Funktionen anropades och innan körningen slutfördes anropades SQLCancel eller SQLCancelHandle på StatementHandleoch sedan anropades funktionen igen på StatementHandle-. Funktionen anropades och innan körningen slutfördes anropades SQLCancel eller SQLCancelHandle på StatementHandle från en annan tråd i ett flertrådsprogram och sedan anropades funktionen igen på StatementHandle. |
HY009 | Ogiltig användning av null-pekare | (DM) Argumentet TargetValuePtr var en null-pekare. |
HY010 | Funktionssekvensfel | (DM) Den angivna StatementHandle- inte var i körd tillstånd. Funktionen anropades utan att först anropa SQLExecDirect, SQLExecute eller en katalogfunktion. (DM) En asynkront körande funktion anropades för anslutningshandtaget som är associerat med StatementHandle-. Den här asynkrona funktionen kördes fortfarande när funktionen SQLGetData anropades. (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, SQLBulkOperationseller 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) StatementHandle- var i ett kört tillstånd, men ingen resultatuppsättning var associerad med StatementHandle-. Ett anrop till SQLExecute, SQLExecDirecteller SQLMoreResults returnerade SQL_PARAM_DATA_AVAILABLE, men SQLGetData- anropades i stället för SQLParamData. |
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 | (DM) Värdet som angavs för argumentet BufferLength var mindre än 0. Värdet som angavs för argumentet BufferLength var mindre än 4, Col_or_Param_Num-argumentet angavs till 0 och drivrutinen var en ODBC 2*.x*-drivrutin. |
HY109 | Ogiltig markörposition | Markören placerades (av SQLSetPos, SQLFetch, SQLFetchScrolleller SQLBulkOperations) på en rad som hade tagits bort eller inte kunde hämtas. Markören var en framåtriktad markör och raduppsättningens storlek var större än en. |
HY117 | Anslutningen pausas på grund av okänt transaktionstillstånd. Endast frånkopplings- och skrivskyddade funktioner tillåts. | (DM) Mer information om inaktiverat tillstånd finns i SQLEndTran Function. |
HYC00 | Valfri funktion har inte implementerats | Drivrutinen eller datakällan stöder inte användning av SQLGetData- med flera rader i SQLFetchScroll. Den här beskrivningen gäller inte för drivrutiner som returnerar SQL_GD_BLOCK bitmask för alternativet SQL_GETDATA_EXTENSIONS i SQLGetInfo-. Drivrutinen eller datakällan stöder inte konverteringen som anges av kombinationen av argumentet TargetType och SQL-datatypen för motsvarande kolumn. Det här felet gäller endast när SQL-datatypen för kolumnen mappades till en drivrutinsspecifik SQL-datatyp. Drivrutinen stöder endast ODBC 2*.x*, och argumentet TargetType var något av följande: SQL_C_NUMERIC SQL_C_SBIGINT SQL_C_UBIGINT och någon av intervall C-datatyperna som anges i C-datatyper i bilaga D: Datatyper. Drivrutinen stöder endast ODBC-versioner före 3.50 och argumentet TargetType SQL_C_GUID. |
HYT01 | Tidsgränsen för anslutningen har upphört att gälla | 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 motsvarar 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å 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. |
Kommentarer
SQLGetData- returnerar data i en angiven kolumn. SQLGetData kan bara anropas när en eller flera rader har hämtats från resultatuppsättningen av SQLFetch, SQLFetchScrolleller SQLExtendedFetch. Om data med variabel längd är för stora för att returneras i ett enda anrop för att SQLGetData- (på grund av en begränsning i programmet), kan SQLGetData hämta dem i delar. Det går att binda vissa kolumner i en rad och anropa SQLGetData för andra, även om detta omfattas av vissa begränsningar. Mer information finns i Hämta långa data.
Information om hur du använder SQLGetData- med strömmade utdataparametrar finns i Hämta utdataparametrar med SQLGetData.
Använda SQLGetData
Om drivrutinen inte stöder tillägg till SQLGetDatakan funktionen endast returnera data för obundna kolumner med ett tal som är större än för den senaste bundna kolumnen. Inom en rad med data måste dessutom värdet för argumentet Col_or_Param_Num i varje anrop till SQLGetData vara större än eller lika med värdet för Col_or_Param_Num i föregående anrop. Data måste hämtas i ökande kolumnnummerordning. Om inga tillägg stöds kan SQLGetData inte anropas om raduppsättningens storlek är större än 1.
Drivrutiner kan lätta på någon av dessa begränsningar. För att avgöra vilka begränsningar en drivrutin kopplar av anropar ett program SQLGetInfo med något av följande SQL_GETDATA_EXTENSIONS alternativ:
SQL_GD_OUTPUT_PARAMS = SQLGetData kan anropas för att returnera utdataparametervärden. Mer information finns i Hämta utdataparametrar med SQLGetData.
SQL_GD_ANY_COLUMN. Om det här alternativet returneras kan SQLGetData- anropas för alla obundna kolumner, inklusive de före den sista bundna kolumnen.
SQL_GD_ANY_ORDER. Om det här alternativet returneras kan SQLGetData- anropas för obundna kolumner i valfri ordning.
SQL_GD_BLOCK. Om det här alternativet returneras av SQLGetInfo- för SQL_GETDATA_EXTENSIONS InfoType stöder drivrutinen anrop till SQLGetData när raduppsättningens storlek är större än 1 och programmet kan anropa SQLSetPos med alternativet SQL_POSITION för att placera markören på rätt rad innan SQLGetData anropas.
SQL_GD_BOUND. Om det här alternativet returneras kan SQLGetData- anropas för bundna kolumner samt obundna kolumner.
Det finns två undantag till dessa begränsningar och en förares möjlighet att lätta på dem. För det första bör SQLGetData- aldrig anropas för en framåtriktad markör när raduppsättningens storlek är större än 1. För det andra, om en drivrutin stöder bokmärken, måste den alltid ha stöd för möjligheten att anropa SQLGetData för kolumn 0, även om det inte tillåter att program anropar SQLGetData för andra kolumner före den sista bundna kolumnen. (När ett program arbetar med en ODBC 2*.x*-drivrutin, SQLGetData- returnerar ett bokmärke när det anropas med Col_or_Param_Num lika med 0 efter ett anrop till SQLFetcheftersom SQLFetch mappas av ODBC 3*.x* Driver Manager till SQLExtendedFetch med en FetchOrientation av SQL_FETCH_NEXT, och SQLGetData- med Col_or_Param_Num 0 mappas av ODBC 3*.x* Driver Manager till SQLGetStmtOption med en fOption- av SQL_GET_BOOKMARK.)
SQLGetData kan inte användas för att hämta bokmärket för en rad som just infogats genom att anropa SQLBulkOperations med alternativet SQL_ADD eftersom markören inte är placerad på raden. Ett program kan hämta bokmärket för en sådan rad genom att binda kolumn 0 innan SQLBulkOperations anropas med SQL_ADD, i vilket fall SQLBulkOperations returnerar bokmärket i den bundna bufferten. SQLFetchScroll kan anropas med SQL_FETCH_BOOKMARK för att flytta markören på den raden.
Om argumentet TargetType är en intervalldatatyp används standardintervallets inledande precision (2) och standardintervallets sekundprecision (6), som anges i fälten SQL_DESC_DATETIME_INTERVAL_PRECISION respektive SQL_DESC_PRECISION i ARD för data. Om argumentet TargetType är en SQL_C_NUMERIC datatyp används standardprecisionen (drivrutinsdefinierad) och standardskalan (0), som anges i SQL_DESC_PRECISION- och SQL_DESC_SCALE fälten i ARD, för data. Om någon standardprecision eller skalning inte är lämplig bör programmet uttryckligen ange lämpligt deskriptorfält med ett anrop till SQLSetDescField eller SQLSetDescRec. Det kan ange SQL_DESC_CONCISE_TYPE fältet till SQL_C_NUMERIC och anropa SQLGetData- med ett TargetType- argument för SQL_ARD_TYPE, vilket gör att precisions- och skalningsvärdena i deskriptorfälten används.
Not
I ODBC 2*.x* anger program TargetType till SQL_C_DATE, SQL_C_TIME eller SQL_C_TIMESTAMP för att indikera att *TargetValuePtr är en datum-, tids- eller tidsstämpelstruktur. I ODBC 3*.x* anger program TargetType till SQL_C_TYPE_DATE, SQL_C_TYPE_TIME eller SQL_C_TYPE_TIMESTAMP. Driver Manager gör lämpliga mappningar om det behövs, baserat på programmet och drivrutinsversionen.
Hämtar Variable-Length data i delar
SQLGetData- kan användas för att hämta data från en kolumn som innehåller data med variabel längd i delar, dvs. när identifieraren för SQL-datatypen för kolumnen är SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR, SQL_WCHAR, SQL_WVARCHAR, SQL_WLONGVARCHAR, SQL_BINARY, SQL_VARBINARY, SQL_LONGVARBINARY eller en drivrutinsspecifik identifierare för en typ av variabel längd.
För att hämta data från en kolumn i delar anropar programmet SQLGetData flera gånger i följd för samma kolumn. Vid varje anrop returnerar SQLGetData nästa del av data. Det är upp till programmet att sätta ihop delarna igen och se till att ta bort null-avslutningstecknet från mellanliggande delar av teckendata. Om det finns mer data att returnera eller inte tillräckligt med buffert allokerades för sluttecknet returnerar SQLGetData SQL_SUCCESS_WITH_INFO och SQLSTATE 01004 (trunkerade data). När den returnerar den sista delen av data returnerar SQLGetData SQL_SUCCESS. Varken SQL_NO_TOTAL eller noll kan returneras vid det senaste giltiga anropet för att hämta data från en kolumn, eftersom programmet då inte skulle ha något sätt att veta hur mycket av data i programbufferten som är giltiga. Om SQLGetData- anropas efter detta returneras SQL_NO_DATA. Mer information finns i nästa avsnitt, "Hämta data med SQLGetData".
Bokmärken med variabel längd kan returneras i delar av SQLGetData. Precis som med andra data returnerar ett anrop till SQLGetData för att returnera bokmärken med variabel längd i delar SQLSTATE 01004 (Strängdata, höger trunkerade) och SQL_SUCCESS_WITH_INFO när det finns mer data som ska returneras. Detta skiljer sig från fallet när ett bokmärke med variabel längd trunkeras av ett anrop till SQLFetch eller SQLFetchScroll, som returnerar SQL_ERROR och SQLSTATE 22001 (Strängdata, höger trunkerade).
SQLGetData kan inte användas för att returnera data med fast längd i delar. Om SQLGetData- anropas mer än en gång i rad för en kolumn som innehåller data med fast längd, returneras SQL_NO_DATA för alla anrop efter den första.
Hämtar strömmade utdataparametrar
Om en drivrutin stöder strömmade utdataparametrar kan ett program anropa SQLGetData- med en liten buffert många gånger för att hämta ett stort parametervärde. Mer information om strömmad utdataparameter finns i Hämta utdataparametrar med SQLGetData.
Hämta data med SQLGetData
Om du vill returnera data för den angivna kolumnen utför SQLGetData följande stegsekvens:
Returnerar SQL_NO_DATA om alla data för kolumnen redan har returnerats.
Anger *StrLen_or_IndPtr till SQL_NULL_DATA om data är NULL. Om data är NULL och StrLen_or_IndPtr var en nullpekare returnerar SQLGetData SQLSTATE 22002 (indikatorvariabel krävs men inte tillhandahålls).
Om data för kolumnen inte är NULL fortsätter SQLGetData till steg 3.
Om SQL_ATTR_MAX_LENGTH-instruktionsattributet är inställt på ett icke-nollvärde, om kolumnen innehåller tecken eller binära data, och om SQLGetData- inte tidigare har anropats för kolumnen, trunkeras data till SQL_ATTR_MAX_LENGTH byte.
Not
Attributet SQL_ATTR_MAX_LENGTH-instruktionen är avsett att minska nätverkstrafiken. Den implementeras vanligtvis av datakällan, som trunkerar data innan de returneras i nätverket. Drivrutiner och datakällor krävs inte för att stödja det. För att garantera att data trunkeras till en viss storlek bör ett program därför allokera en buffert av den storleken och ange storleken i argumentet BufferLength.
Konverterar data till den typ som anges i TargetType-. Data får standardprecision och skalning för den datatypen. Om TargetType- är SQL_ARD_TYPE används datatypen i fältet SQL_DESC_CONCISE_TYPE i ARD. Om TargetType- är SQL_ARD_TYPE får data precisionen och skalan i fälten SQL_DESC_DATETIME_INTERVAL_PRECISION, SQL_DESC_PRECISION och SQL_DESC_SCALE i ARD, beroende på datatypen i fältet SQL_DESC_CONCISE_TYPE. Om någon standardprecision eller skalning inte är lämplig bör programmet uttryckligen ange lämpligt deskriptorfält med ett anrop till SQLSetDescField eller SQLSetDescRec.
Om data konverterades till en datatyp med variabel längd, till exempel tecken eller binär, kontrollerar SQLGetData om datalängden överskrider BufferLength. Om längden på teckendata (inklusive null-avslutningstecken) överskrider BufferLengthtrunkerar SQLGetData data till BufferLength mindre längden på ett null-avslutningstecken. Sedan null-avslutar data. Om längden på binära data överskrider databuffertens längd trunkerar SQLGetData den till BufferLength byte.
Om den angivna databufferten är för liten för att innehålla null-avslutningstecknet returnerar SQLGetData SQL_SUCCESS_WITH_INFO och SQLSTATE 01004.
SQLGetData aldrig trunkerar data som konverterats till datatyper med fast längd. Det förutsätter alltid att längden på *TargetValuePtr är storleken på datatypen.
Placerar konverterade (och eventuellt trunkerade) data i *TargetValuePtr. Observera att SQLGetData inte kan returnera data över linjen.
Placerar längden på data i *StrLen_or_IndPtr. Om StrLen_or_IndPtr var en nullpekare returnerar SQLGetData inte längden.
För tecken- eller binärdata är detta längden på data efter konverteringen och före trunkering på grund av BufferLength-. Om drivrutinen inte kan fastställa längden på data efter konverteringen, vilket ibland är fallet med långa data, returnerar den SQL_SUCCESS_WITH_INFO och anger längden till SQL_NO_TOTAL. (Det senaste anropet till SQLGetData- måste alltid returnera datalängden, inte noll eller SQL_NO_TOTAL.) Om data trunkerades på grund av SQL_ATTR_MAX_LENGTH-instruktionsattributet placeras värdet för det här attributet i stället för den faktiska längden i *StrLen_or_IndPtr. Det beror på att det här attributet är utformat för att trunkera data på servern före konverteringen, så att drivrutinen inte kan ta reda på vad den faktiska längden är. När SQLGetData- anropas flera gånger i följd för samma kolumn är det här längden på de data som är tillgängliga i början av det aktuella anropet. det vill säga att längden minskar för varje efterföljande anrop.
För alla andra datatyper är det här längden på data efter konverteringen. Det är alltså storleken på den typ som data konverterades till.
Om data trunkeras utan förlust av signifikans under konverteringen (till exempel det verkliga talet 1.234 trunkeras när det konverteras till heltal 1) eller på grund av att BufferLength är för liten (till exempel att strängen "abcdef" placeras i en 4-bytesbuffert) SQLGetData returnerar SQLSTATE 01004 (data trunkerade) och SQL_SUCCESS_WITH_INFO. Om data trunkeras utan signifikansförlust på grund av SQL_ATTR_MAX_LENGTH-instruktionsattributet returnerar SQLGetData SQL_SUCCESS och returnerar inte SQLSTATE 01004 (trunkerade data).
Innehållet i den bundna databufferten (om SQLGetData- anropas för en bunden kolumn) och bufferten för längd/indikator är odefinierad om SQLGetData- inte returnerar SQL_SUCCESS eller SQL_SUCCESS_WITH_INFO.
Efterföljande anrop till SQLGetData hämtar data från den senaste begärda kolumnen. tidigare förskjutningar blir ogiltiga. Till exempel när följande sekvens utförs:
SQLGetData(icol=n), SQLGetData(icol=m), SQLGetData(icol=n)
det andra anropet till SQLGetData(icol=n) hämtar data från början av kolumnen n. Alla förskjutningar i data på grund av tidigare anrop till SQLGetData- för kolumnen är inte längre giltiga.
Deskriptorer och SQLGetData
SQLGetData- interagerar inte direkt med några beskrivande fält.
Om TargetType- är SQL_ARD_TYPE används datatypen i fältet SQL_DESC_CONCISE_TYPE i ARD. Om TargetType- antingen är SQL_ARD_TYPE eller SQL_C_DEFAULT, får data precisionen och skalan i fälten SQL_DESC_DATETIME_INTERVAL_PRECISION, SQL_DESC_PRECISION och SQL_DESC_SCALE i ARD, beroende på datatypen i fältet SQL_DESC_CONCISE_TYPE.
Kodexempel
I följande exempel kör ett program en SELECT--instruktion för att returnera en resultatuppsättning med kund-ID:t, namn och telefonnummer sorterade efter namn, ID och telefonnummer. För varje rad med data anropas SQLFetch för att placera markören till nästa rad. Den anropar SQLGetData- för att hämta hämtade data. buffertarna för data och det returnerade antalet byte anges i anropet till SQLGetData. Slutligen skrivs varje anställds namn, ID och telefonnummer ut.
#define NAME_LEN 50
#define PHONE_LEN 50
SQLCHAR szName[NAME_LEN], szPhone[PHONE_LEN];
SQLINTEGER sCustID, cbName, cbAge, cbBirthday;
SQLRETURN retcode;
SQLHSTMT hstmt;
retcode = SQLExecDirect(hstmt,
"SELECT CUSTID, NAME, PHONE FROM CUSTOMERS ORDER BY 2, 1, 3",
SQL_NTS);
if (retcode == SQL_SUCCESS) {
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
show_error();
}
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Get data for columns 1, 2, and 3 */
SQLGetData(hstmt, 1, SQL_C_ULONG, &sCustID, 0, &cbCustID);
SQLGetData(hstmt, 2, SQL_C_CHAR, szName, NAME_LEN, &cbName);
SQLGetData(hstmt, 3, SQL_C_CHAR, szPhone, PHONE_LEN,
&cbPhone);
/* Print the row of data */
fprintf(out, "%-5d %-*s %*s", sCustID, NAME_LEN-1, szName,
PHONE_LEN-1, szPhone);
} else {
break;
}
}
}
Relaterade funktioner
Mer information om | Se |
---|---|
Tilldela lagring för en kolumn i en resultatuppsättning | SQLBindCol |
Utföra massåtgärder som inte är relaterade till blockmarkörens position | SQLBulkOperations |
Avbryta instruktionsbearbetning | SQLCancel |
Köra en SQL-instruktion | SQLExecDirect |
Köra en förberedd SQL-instruktion | SQLExecute |
Hämtar ett datablock eller bläddrar igenom en resultatuppsättning | SQLFetchScroll |
Hämtar en enskild rad med data eller ett datablock i framåtriktad riktning | SQLFetch |
Skicka parameterdata vid körning | SQLPutData |
Placera markören, uppdatera data i raduppsättningen eller uppdatera eller ta bort data i raduppsättningen | SQLSetPos |
Se även
ODBC API-referens
ODBC-huvudfiler
hämtar utdataparametrar med SQLGetData