Поделиться через


SQLGetData

SQLGetData используется для получения данных результирующих наборов без привязки значений столбцов. SqlGetData можно вызывать последовательно в одном столбце для получения больших объемов данных из столбца с типом данных text, ntext или image .

В приложении не обязательно выполнять привязку данных для получения данных результирующего набора. Данные любого столбца можно получить из драйвера ODBC SQL Server Native Client с помощью SQLGetData.

Драйвер ODBC SQL Server Native Client не поддерживает использование SQLGetData для извлечения данных в случайном порядке столбцов. Все несвязанные столбцы, обрабатываемые с помощью SQLGetData , должны иметь более высокие порядковые номера столбцов, чем связанные столбцы в результирующем наборе. Приложение обрабатывает данные непривязанных столбцов (начиная со столбца с наименьшим порядковым номером и заканчивая столбцом с наибольшим порядковым номером). Попытка получить данные из столбца с более низким порядковым номером приведет к ошибке. Если в приложении используются серверные курсоры для формирования сообщений о строках результирующего набора, то приложение может повторно получить текущую строку, а затем получить значение столбца. Если инструкция выполняется на курсоре, доступном только для чтения и пересылки по умолчанию, необходимо повторно выполнить инструкцию для резервного копирования SQLGetData.

Драйвер ODBC SQL Server Native Client точно сообщает длину данных text, ntext и image, полученных с помощью SQLGetData. Приложение может использовать возвращаемый параметр StrLen_or_IndPtr для быстрого получения длинных данных.

Примечание

Для типов больших значений StrLen_or_IndPtr будет возвращать SQL_NO_TOTAL в случаях усечения данных.

Поддержка методом SQLGetData улучшенных функций даты и времени

Значения столбцов результатов типов даты и времени преобразуются, как описано в разделе Преобразования из SQL в C.

Дополнительные сведения см. в разделе Улучшения даты и времени (ODBC).

Поддержка методом SQLGetData больших определяемых пользователем типов (UDT) в среде CLR

SQLGetData поддерживает большие определяемые пользователем типы (UT) среды CLR. Дополнительные сведения см. в статье Типы больших User-Defined среды CLR (ODBC).

Пример

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

См. также:

Функция SQLGetData
ODBC API Implementation Details