SQLGetData

SQLGetData se usa para recuperar datos del conjunto de resultados sin enlazar valores de columna. Se puede llamar sucesivamente a SQLGetData en la misma columna para recuperar cantidades grandes de datos de una columna con un tipo de datos text, ntext o image.

No es necesario que una aplicación enlace variables para capturar datos del conjunto de resultados. Los datos de cualquier columna se pueden recuperar del controlador ODBC de SQL Server Native Client mediante SQLGetData.

El controlador ODBC de SQL Server Native Client no permite usar SQLGetData para recuperar datos en orden aleatorio de columna. Todas las columnas sin enlazar procesadas con SQLGetData deben tener los ordinales de las columnas más altos que los de las columnas enlazadas en el conjunto de resultados. La aplicación debe procesar datos desde el valor ordinal de la columna sin enlazar más bajo hasta el valor más alto. Al intentar recuperar datos de una columna con un número ordinal más bajo, se genera un error. Si la aplicación está usando cursores de servidor para notificar las filas del conjunto de resultados, la aplicación puede intentar volver a capturar la fila actual y, a continuación, capturar el valor de una columna. Si una instrucción se ejecuta en el valor predeterminado de sólo lectura, cursor de sólo avance, se debe volver a ejecutar la instrucción para realizar un copia de seguridad de SQLGetData.

El controlador ODBC de SQL Server Native Client notifica con precisión la longitud de los datos recuperados text, ntext e image mediante SQLGetData. La aplicación puede hacer buen uso del parámetro StrLen_or_IndPtr devuelto para recuperar rápidamente los datos largos.

Nota

Para tipos de valor grandes, StrLen_or_IndPtr devolverá SQL_NO_TOTAL en casos de truncamiento de datos.

SQLGetData admite las características mejoradas de fecha y hora

Los valores de la columna de resultados de tipos de fecha y hora se convierten como se describe en Conversiones de SQL a C.

Para obtener más información, vea Mejoras en los tipos de datos de fecha y hora (ODBC).

SQLGetData admite UDT CLR grandes

SQLGetData admite los tipos definidos por el usuario (UDT) CLR grandes. Para obtener más información, vea Tipos CLR grandes definidos por el usuario (ODBC).

Ejemplo

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