SQLGetData

SQLGetData wird verwendet, um Resultsetdaten ohne bindende Spaltenwerte abzurufen. SQLGetData kann für eine Spalte mehrmals nacheinander aufgerufen werden, um große Datenmengen von einer Spalte des Datentyps text, ntext oder image abzurufen.

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

Der ODBC-Treiber von SQL Server Native Client lässt nicht zu, dass mit SQLGetData Daten in einer beliebigen Spaltenreihenfolge abgerufen werden. Alle ungebundenen Spalten, die mit SQLGetData verarbeitet werden, müssen über höhere Spaltenordnungszahlen als die gebundenen Spalten im Resultset verfügen. 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 Anwendung mit dem standardmäßigen schreibgeschützten Vorwärtscursor ausgeführt wird, müssen Sie die Anweisung erneut ausführen, um SQLGetData zu unterstützen.

Der ODBC-Treiber von SQL Server Native Client gibt die Länge der mit SQLGetData abgerufenen Daten des Typs text, ntext und image richtig aus. Die Anwendung kann die StrLen_or_IndPtr-Parameterrückgabe nutzen, um lange Daten schnell abzurufen.

HinweisHinweis

Bei Typen mit hohen Werten gibt StrLen_or_IndPtr SQL_NO_TOTAL zurück, wenn die Daten abgeschnitten werden.

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

Ergebnisspaltenwerte vom Datums- bzw. Uhrzeit-Typ werden konvertiert, wie in Konvertierungen von SQL in C beschrieben.

Weitere Informationen finden Sie unter Datums-/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 Große benutzerdefinierte CLR-Typen (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.
        }
    }

Siehe auch

Konzepte

Andere Ressourcen