Freigeben über


SQLGetData

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Analytics Platform System (PDW)

SQLGetData wird verwendet, um Resultsetdaten ohne Bindungsspaltenwerte abzurufen. SQLGetData kann nacheinander in derselben Spalte 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 nicht die Verwendung von SQLGetData zum Abrufen von Daten in zufälliger Spaltenreihenfolge. Alle ungebundenen Spalten, die mit SQLGetData verarbeitet werden, müssen höhere Spalten-Ordnungszahlen aufweisen als die gebundenen Spalten im Resultset. 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 ODBC-Treiber für SQL Server Native Client meldet genau die Länge von Text-, ntext- und Bilddaten, die mit SQLGetData abgerufen wurden. Die Anwendung kann den StrLen_or_IndPtr Parameter verwenden, um lange Daten schnell abzurufen.

Hinweis

Bei großen Werttypen gibt StrLen_or_IndPtr in Fällen von Datenkürzungen SQL_NO_TOTAL zurück.

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

Ergebnisspaltenwerte von Datums-/Uhrzeittypen werden wie in 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-Implementierungsdetails