Compartir a través de


SQLGetData

SQLGetData se usa para recuperar datos del conjunto de resultados sin enlazar valores de columna. SqlGetData se puede llamar sucesivamente en la misma columna para recuperar grandes cantidades 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 admite el uso de SQLGetData para recuperar datos en orden de columna aleatorio. Todas las columnas sin enlazar procesadas con SQLGetData deben tener ordinales de columna superiores a las columnas enlazadas del conjunto de resultados. La aplicación debe procesar los datos del valor de columna ordinal sin enlazar más bajo al más alto. Si se intenta recuperar datos de una columna con números inferiores o numéricos, se produce un error. Si la aplicación usa cursores de servidor para notificar filas del conjunto de resultados, la aplicación puede volver a capturar la fila actual y, a continuación, capturar el valor de una columna. Si una instrucción se ejecuta en el cursor predeterminado de solo lectura, de solo avance, debe volver a ejecutar la instrucción para realizar una copia de seguridad de SQLGetData.

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

Nota:

En el caso de los tipos de valor grande, StrLen_or_IndPtr devolverá SQL_NO_TOTAL en casos de truncamiento de datos.

Compatibilidad de SQLGetData con características mejoradas de fecha y hora

Los valores de 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 de fecha y hora (ODBC).

Compatibilidad de SQLGetData con UDT clR grandes

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

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

Véase también

Función SQLGetData
Detalles de implementación de la API de ODBC