SQLGetData

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

SQLGetData används för att hämta resultatmängdsdata utan att binda kolumnvärden. SQLGetData kan anropas successivt på samma kolumn för att hämta stora mängder data från en kolumn med en text-, ntext- eller bilddatatyp .

Det finns inget krav på att en applikation binder variabler för att hämta resultatdata. Data från vilken kolumn som helst kan hämtas från SQL Server Native Client ODBC-drivrutinen genom att använda SQLGetData.

SQL Server Native Client ODBC-drivrutinen stöder inte användning av SQLGetData för att hämta data i slumpmässig kolumnordning. Alla obundna kolumner som bearbetas med SQLGetData måste ha högre kolumnordinaler än de bundna kolumnerna i resultatmängden. Applikationen måste bearbeta data från det lägsta obundna ordinala kolumnvärdet till det högsta. Försök att hämta data från en kolumn med lägre ordningsnummer resulterar i ett fel. Om applikationen använder servermarkörer för att rapportera resultatuppsättningsrader kan applikationen re-referera den aktuella raden och sedan hämta värdet på en kolumn. Om en sats körs på den standard skrivskyddade, framåtriktade markören måste du köra om satsen för att säkerhetskopiera SQLGetData.

SQL Server Native Client ODBC-drivrutinen rapporterar noggrant längden på text-, ntext- och bilddata som hämtas med SQLGetData. Applikationen kan utnyttja StrLen_or_IndPtr parameterretur väl för att snabbt hämta långa data.

Note

För stora värdetyper kommer StrLen_or_IndPtr att returnera SQL_NO_TOTAL vid datatrunkering.

SQLGetData-stöd för förbättrade datum- och tidsfunktioner

Resultatkolumnvärden för datum/tid-typer konverteras enligt beskrivningen i Konverteringar från SQL till C.

Mer information finns i Förbättringar av datum och tid (ODBC).

SQLGetData-stöd för stora CLR UDT:er

SQLGetData stöder stora CLR-användardefinierade typer (UDT). Mer information finns i Large CLR User-Defined Types (ODBC).

Example

SQLHDBC     hDbc = NULL;  
SQLHSTMT    hStmt = NULL;  
long        lEmpID;  
PBYTE       pPicture;  
SQLINTEGER  pIndicators[2];  
  
// Get an environment, connection, and so on.  
...  
  
// Get a statement handle and execute a command.  
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);  
  
if (SQLExecDirect(hStmt,  
    (SQLCHAR*) "SELECT EmployeeID, Photo FROM Employees",  
    SQL_NTS) == SQL_ERROR)  
    {  
    // Handle error and return.  
    }  
  
// Retrieve data from row set.  
SQLBindCol(hStmt, 1, SQL_C_LONG, (SQLPOINTER) &lEmpID, sizeof(long),  
    &pIndicators[0]);  
  
while (SQLFetch(hStmt) == SQL_SUCCESS)  
    {  
    cout << "EmployeeID: " << lEmpID << "\n";  
  
    // Call SQLGetData to determine the amount of data that's waiting.  
    if (SQLGetData(hStmt, 2, SQL_C_BINARY, pPicture, 0, &pIndicators[1])  
        == SQL_SUCCESS_WITH_INFO)  
        {  
        cout << "Photo size: " pIndicators[1] << "\n\n";  
  
        // Get all the data at once.  
        pPicture = new BYTE[pIndicators[1]];  
        if (SQLGetData(hStmt, 2, SQL_C_DEFAULT, pPicture,  
            pIndicators[1], &pIndicators[1]) != SQL_SUCCESS)  
            {  
            // Handle error and continue.  
            }  
  
        delete [] pPicture;  
        }  
    else  
        {  
        // Handle error on attempt to get data length.  
        }  
    }