SQLGetData

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytický platformní systém (PDW)

SQLGetData se používá k získávání dat výsledné sady bez vázání hodnot sloupců. SQLGetData lze postupně volat na stejném sloupci pro získání velkého množství dat ze sloupce s textem,ntextem nebo obrazovým datovým typem.

Aplikace nemusí vázat proměnné pro načítání dat o výsledné sadě. Data z libovolného sloupce lze získat z ovladače SQL Server Native Client ODBC pomocí SQLGetData.

Nativní klientský ODBC ovladač SQL Server nepodporuje použití SQLGetData pro získávání dat v náhodném pořadí sloupců. Všechny nevázané sloupce zpracované pomocí SQLGetData musí mít vyšší sloupcové ordinály než vázané sloupce ve výsledné množině. Aplikace musí zpracovávat data od nejnižší neomezené hodnoty sloupce až po nejvyšší. Pokus o získání dat z níže číslovaného sloupce vede k chybě. Pokud aplikace používá serverové kurzory k hlášení řádků výsledků, může znovu načíst aktuální řádek a poté získat hodnotu sloupce. Pokud je příkaz vykonán na výchozím kurzoru pouze pro čtení a dopředu, musíte příkaz znovu spustit pro zálohování SQLGetData.

Ovladač ODBC pro nativního klienta SQL Server přesně hlásí délku textových, ntextových a obrazových dat získaných pomocí SQLGetData. Aplikace dokáže dobře využít návrat parametrů StrLen_or_IndPtr k rychlému načtení dlouhých dat.

Note

Pro typy s velkými hodnotami StrLen_or_IndPtr vrátí SQL_NO_TOTAL v případech ořezávání dat.

Podpora SQLGetData pro vylepšené funkce data a času

Hodnoty výsledků sloupců typů dat/času jsou převedeny podle popisu Konverze ze SQL do C.

Další informace naleznete v tématu vylepšení data a času (ODBC).

Podpora SQLGetData pro velké CLR UDT

SQLGetData podporuje velké uživatelsky definované typy CLR (UDT). Další informace najdete v tématuVelké typy User-Defined CLR (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.  
        }  
    }