SQLGetData

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

SQLGetData wird verwendet, um Resultsetdaten ohne Bindung von Spaltenwerten abzurufen. SQLGetData kann in derselben Spalte nacheinander aufgerufen werden, um große Datenmengen aus einer Spalte mit einem Text-, ntext- oder Bilddatentyp abzurufen.

Es wird nicht vorausgesetzt, dass eine Anwendung Variablen binden muss, um Resultsetdaten abrufen zu können. Die Daten einer beliebigen Spalte können mithilfe von SQLGetData aus dem SQL Server Native Client ODBC-Treiber abgerufen werden.

Der SQL Server Native Client ODBC-Treiber unterstützt die Verwendung von SQLGetData zum Abrufen von Daten in zufälliger Spaltenreihenfolge nicht. Alle ungebundenen Spalten, die mit SQLGetData verarbeitet werden, müssen höhereSpaltenn als die gebundenen Spalten im Resultset aufweisen. Die Anwendung muss die Daten vom niedrigsten nicht gebundenen ordinalen Spaltenwert zum höchsten Spaltenwert verarbeiten. Der Versuch, Daten aus einer Spalte mit einer niedrigeren Ordnungszahl abzurufen, führt zu einem Fehler. Wenn die Anwendung Servercursor zur Ausgabe von Resultsetzeilen verwendet, kann die Anwendung erneut die aktuelle Zeile abrufen und dann den Wert einer Spalte abrufen. Wenn eine Anweisung auf dem standardmäßigen schreibgeschützten Vorwärtscursor ausgeführt wird, müssen Sie die Anweisung erneut ausführen, um SQLGetData zu sichern.

Der SQL Server Native Client ODBC-Treiber meldet genau die Länge von Text-, ntext- und Bilddaten, die mithilfe von SQLGetData abgerufen werden. Die Anwendung kann den StrLen_or_IndPtr-Parameters gut nutzen, um lange Daten schnell abzurufen.

Hinweis

Bei großen Werttypen gibt StrLen_or_IndPtr SQL_NO_TOTAL zurück, wenn Daten abgeschnitten werden.

SQLGetData-Unterstützung für verbesserte Funktionen für Datum/Uhrzeit

Ergebnisspaltenwerte von Datums-/Uhrzeittypen werden wie unter Konvertierungen von SQL in C beschrieben konvertiert.

Weitere Informationen finden Sie unter Datums- und Uhrzeitverbesserungen (ODBC).

SQLGetData-Unterstützung für große CLR-UDTs

SQLGetData unterstützt große benutzerdefinierte CLR-Typen (UDTs). Weitere Informationen finden Sie unter Large CLR User-Defined Types (ODBC).

Beispiel

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.  
        }  
    }  

Weitere Informationen

SQLGetData-Funktion
ODBC API Implementation Details