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


SQLGetData

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

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

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

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

ПримечаниеПримечание

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

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

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

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

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

Метод SQLGetData поддерживает большие определяемые пользователем типы данных CLR. Дополнительные сведения см. в разделе Определяемые пользователем типы данных больших значений 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.
        }
    }

См. также

Основные понятия

Подробности реализации API-интерфейса ODBC

Другие ресурсы

Функция SQLGetData