Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
DBMS definierar långa data som alla tecken eller binära data över en viss storlek, till exempel 255 tecken. Dessa data kan vara tillräckligt små för att lagras i en enda buffert, till exempel en delbeskrivning med flera tusen tecken. Det kan dock vara för lång tid att lagra i minnet, till exempel långa textdokument eller bitmappar. Eftersom sådana data inte kan lagras i en enda buffert hämtas de från drivrutinen i delar med SQLGetData efter att andra data på raden har hämtats.
Anmärkning
Ett program kan faktiskt hämta alla typer av data med SQLGetData, inte bara långa data, även om endast tecken och binära data kan hämtas i delar. Men om data är tillräckligt små för att få plats i en enda buffert finns det i allmänhet ingen anledning att använda SQLGetData. Det är mycket enklare att binda en buffert till kolumnen och låta drivrutinen returnera data i bufferten.
För att hämta långa data från en kolumn anropar ett program först SQLFetchScroll eller SQLFetch för att flytta till en rad och hämta data för bundna kolumner. Programmet anropar sedan SQLGetData. SQLGetData har samma argument som SQLBindCol: en instruktionsreferens; ett kolumnnummer. C-datatypen, adressen och bytelängden för en programvariabel. och adressen till en längd-/indikatorbuffert. Båda funktionerna har samma argument eftersom de utför i stort sett samma uppgift: Båda beskriver en programvariabel för drivrutinen och anger att data för en viss kolumn ska returneras i den variabeln. De största skillnaderna är att SQLGetData anropas efter att en rad har hämtats (och kallas ibland för sen bindning av den anledningen) och att bindningen som anges av SQLGetData endast varar under anropets varaktighet.
När det gäller en enskild kolumn fungerar SQLGetData som SQLFetch: Den hämtar data för kolumnen, konverterar den till typen av programvariabel och returnerar den i variabeln. Den returnerar också bytelängden för data i längd-/indikatorbufferten. Mer information om hur SQLFetch returnerar data finns i Hämta en rad med data.
SQLGetData skiljer sig från SQLFetch i ett viktigt avseende. Om det anropas mer än en gång i följd för samma kolumn returnerar varje anrop en efterföljande del av data. Varje anrop utom det senaste anropet returnerar SQL_SUCCESS_WITH_INFO och SQLSTATE 01004 (Strängdata, förkortad); det senaste anropet returnerar SQL_SUCCESS. Så här används SQLGetData för att hämta långa data i delar. När det inte finns några fler data att returnera returnerar SQLGetData SQL_NO_DATA. Programmet ansvarar för att sammanställa långa data, vilket kan innebära att sammanlänka datadelarna. Varje del är null-avslutad. programmet måste ta bort null-avslutningstecknet om delarna sammanfogas. Hämtning av data i delar kan göras för bokmärken med variabel längd och för andra långa data. Värdet som returneras i längden/indikatorbufferten minskar i varje anrop med antalet byte som returnerades i föregående anrop, även om det är vanligt att drivrutinen inte kan identifiera mängden tillgängliga data och returnera en bytelängd på SQL_NO_TOTAL. Till exempel:
// Declare a binary buffer to retrieve 5000 bytes of data at a time.
SQLCHAR BinaryPtr[5000];
SQLUINTEGER PartID;
SQLINTEGER PartIDInd, BinaryLenOrInd, NumBytes;
SQLRETURN rc;
SQLHSTMT hstmt;
// Create a result set containing the ID and picture of each part.
SQLExecDirect(hstmt, "SELECT PartID, Picture FROM Pictures", SQL_NTS);
// Bind PartID to the PartID column.
SQLBindCol(hstmt, 1, SQL_C_ULONG, &PartID, 0, &PartIDInd);
// Retrieve and display each row of data.
while ((rc = SQLFetch(hstmt)) != SQL_NO_DATA) {
// Display the part ID and initialize the picture.
DisplayID(PartID, PartIDInd);
InitPicture();
// Retrieve the picture data in parts. Send each part and the number
// of bytes in each part to a function that displays it. The number
// of bytes is always 5000 if there were more than 5000 bytes
// available to return (cbBinaryBuffer > 5000). Code to check if
// rc equals SQL_ERROR or SQL_SUCCESS_WITH_INFO not shown.
while ((rc = SQLGetData(hstmt, 2, SQL_C_BINARY, BinaryPtr, sizeof(BinaryPtr),
&BinaryLenOrInd)) != SQL_NO_DATA) {
NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ?
5000 : BinaryLenOrInd;
DisplayNextPictPart(BinaryPtr, NumBytes);
}
}
// Close the cursor.
SQLCloseCursor(hstmt);
Det finns flera begränsningar för att använda SQLGetData. Kolumner som nås med SQLGetData i allmänhet:
Måste nås i ordning efter ökande kolumnnummer (på grund av hur kolumnerna i en resultatuppsättning läses från datakällan). Det är till exempel ett fel att anropa SQLGetData för kolumn 5 och sedan anropa det för kolumn 4.
Det går inte att binda.
Måste ha ett högre kolumnnummer än den senaste bundna kolumnen. Om den sista bundna kolumnen till exempel är kolumn 3 är det ett fel att anropa SQLGetData för kolumn 2. Därför bör program se till att placera långa datakolumner i slutet av urvalslistan.
Det går inte att använda om SQLFetch eller SQLFetchScroll anropades för att hämta mer än en rad. Mer information finns i Använda blockmarkörer.
Vissa förare tillämpar inte dessa begränsningar. Samverkande program bör antingen anta att de finns eller avgöra vilka begränsningar som inte tillämpas genom att anropa SQLGetInfo med alternativet SQL_GETDATA_EXTENSIONS.
Om programmet inte behöver alla data i en kolumn med tecken eller binära data kan det minska nätverkstrafiken i DBMS-baserade drivrutiner genom att ange attributet SQL_ATTR_MAX_LENGTH-instruktion innan instruktionen körs. Detta begränsar antalet byte med data som returneras för alla tecken eller binära kolumner. Anta till exempel att en kolumn innehåller långa textdokument. Ett program som bläddrar i tabellen som innehåller den här kolumnen kanske bara måste visa den första sidan i varje dokument. Även om det här deklarationsattributet kan simuleras i drivrutinen, behövs det inte. I synnerhet om ett program vill trunkera tecken eller binära data bör det binda en liten buffert till kolumnen med SQLBindCol och låta drivrutinen trunkera data.