Функция SQLExtendedFetch

Соответствия
Представлена версия: соответствие стандартам ODBC 1.0: не рекомендуется

Сводка
SQLExtendedFetch извлекает указанный набор строк данных из результирующего набора и возвращает данные для всех привязанных столбцов. Наборы строк можно указать в абсолютной или относительной позиции или по закладке.

Заметка

В ODBC 3*.x*, SQLExtendedFetch заменен SQLFetchScroll. Приложения ODBC 3*.x* не должны вызывать SQLExtendedFetch. Вместо этого они должны вызывать SQLFetchScroll. Диспетчер драйверов сопоставляет SQLFetchScroll с SQLExtendedFetch при работе с драйвером ODBC 2*.x*. Драйверы ODBC 3*.x* должны поддерживать SQLExtendedFetch , если они хотят работать с приложениями ODBC 2*.x*, которые вызывают его. Дополнительные сведения см. в разделе "Комментарии" и "Блокируемые курсоры", "Прокручиваемые курсоры" и обратная совместимость в приложении G. Рекомендации по драйверам для обеспечения обратной совместимости.

Синтаксис

  
SQLRETURN SQLExtendedFetch(  
      SQLHSTMT         StatementHandle,  
      SQLUSMALLINT     FetchOrientation,  
      SQLLEN           FetchOffset,  
      SQLULEN *        RowCountPtr,  
      SQLUSMALLINT *   RowStatusArray);  

Аргументы

ОператорHandle
[Входные данные] Дескриптор инструкции.

FetchOrientation
[Входные данные] Тип получения. Это то же самое, что и FetchOrientation в SQLFetchScroll.

FetchOffset
[Входные данные] Число строк для получения. Это то же самое, что и FetchOffset в SQLFetchScroll, за исключением одного исключения. Если FetchOrientation SQL_FETCH_BOOKMARK, FetchOffset является закладкой фиксированной длины, а не смещением из закладки. Другими словами, SQLExtendedFetch извлекает закладку из этого аргумента, а не атрибут оператора SQL_ATTR_FETCH_BOOKMARK_PTR. Она не поддерживает закладки переменной длины и не поддерживает получение набора строк в смещение (кроме 0) из закладки.

RowCountPtr
[Выходные данные] Указатель на буфер, в котором возвращается количество строк, фактически извлекаемых. Этот буфер используется так же, как и буфер, указанный атрибутом инструкции SQL_ATTR_ROWS_FETCHED_PTR. Этот буфер используется только SQLExtendedFetch. Он не используется SQLFetch или SQLFetchScroll.

RowStatusArray
[Выходные данные] Указатель на массив, в котором возвращается состояние каждой строки. Этот массив используется так же, как массив, указанный атрибутом оператора SQL_ATTR_ROW_STATUS_PTR.

Однако адрес этого массива не хранится в поле SQL_DESC_STATUS_ARRAY_PTR в IRD. Кроме того, этот массив используется только SQLExtendedFetch и SQLBulkOperations с операцией SQL_ADD или SQLSetPos, когда он вызывается после SQLExtendedFetch. Он не используется SQLFetch или SQLFetchScroll, и он не используется SQLBulkOperations или SQLSetPos, когда они вызываются после SQLFetch или SQLFetchScroll. Он также не используется при вызове SQLBulkOperations с операцией SQL_ADD перед вызовом любой функции получения. Другими словами, он используется только в состоянии инструкции S7. Он не используется в инструкциях S5 или S6. Дополнительные сведения см. в разделе "Переходы инструкций " в приложении B: таблицы перехода состояния ODBC.

Приложения должны предоставлять допустимый указатель в аргументе RowStatusArray; если нет, поведение SQLExtendedFetch и поведение вызовов SQLBulkOperations или SQLSetPos после того, как курсор был размещен SQLExtendedFetch, не определены.

Возвраты

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_STILL_EXECUTING, SQL_ERROR или SQL_INVALID_HANDLE.

Диагностика

Если SQLExtendedFetch возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO, связанное значение SQLSTATE можно получить путем вызова SQLError. В следующей таблице перечислены значения SQLSTATE, которые обычно возвращаются SQLExtendedFetch и объясняются каждый из них в контексте этой функции. Нотация "(DM)" предшествует описаниям SQLSTATEs, возвращаемым диспетчером драйверов. Возвращаемый код, связанный с каждым значением SQLSTATE, SQL_ERROR, если не указано иное. Если ошибка возникает в одном столбце, SQLGetDiagField можно вызвать с помощью DiagIdentifier SQL_DIAG_COLUMN_NUMBER, чтобы определить столбец, в котором произошла ошибка; и SQLGetDiagField можно вызвать с помощью DiagIdentifier SQL_DIAG_ROW_NUMBER, чтобы определить строку, содержащую этот столбец.

SQLSTATE Error Description
01000 Общее предупреждение Информационное сообщение для конкретного драйвера. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01004 Строковые данные, усеченные справа Строковые или двоичные данные, возвращаемые для столбца, привели к усечению небланковых символов или двоичных данных, отличных от NULL. Если это строковое значение, оно было усечено по правому краю. Если это числовое значение, дробная часть числа была усечена. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01S01 Ошибка в строке Произошла ошибка при выборе одной или нескольких строк. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01S06 Попытка получить, прежде чем результирующий набор вернул первый набор строк Запрошенный набор строк перекрывал начало результирующих наборов, когда текущая позиция была за первой строкой, и значение FetchOrientation было SQL_PRIOR или FetchOrientation было SQL_RELATIVE с отрицательным значением FetchOffset, абсолютное значение которого было меньше или равно текущему SQL_ROWSET_SIZE. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01S07 Дробное усечение Данные, возвращаемые для столбца, были усечены. Для числовых типов данных дробная часть числа была усечена. Для времени, метки времени и типы данных интервала, содержащие компонент времени, дробная часть времени была усечена.

(Функция возвращает SQL_SUCCESS_WITH_INFO.)
07006 Нарушение атрибута ограниченного типа данных Не удалось преобразовать значение данных в тип данных C, указанный TargetType в SQLBindCol.
07009 Недопустимый индекс дескриптора Столбец 0 привязан к SQLBindCol, а атрибут инструкции SQL_ATTR_USE_BOOKMARKS был установлен на SQL_UB_OFF.
08S01 Сбой связи Связь между драйвером и источником данных, к которому был подключен драйвер, произошел сбой до завершения обработки функции.
22002 Переменная индикатора, требуемая, но не указанная Данные NULL извлеклись в столбец, StrLen_or_IndPtr заданный SQLBindCol был пустым указателем.

(Функция возвращает SQL_SUCCESS_WITH_INFO.)
22003 Числовое значение вне диапазона Возвращая числовое значение (как числовое или строковое) для одного или нескольких столбцов, было бы вызвано усечением всей части (в отличие от дробной) части числа.

(Функция возвращает SQL_SUCCESS_WITH_INFO.)

Дополнительные сведения см. в руководствах по типам данных интервала и числовых данных в приложении D: Типы данных.
22007 Недопустимый формат datetime Столбец символов в результирующем наборе привязан к структуре даты, времени или метки времени, а значение в столбце было, соответственно, недопустимой датой, временем или меткой времени.

(Функция возвращает SQL_SUCCESS_WITH_INFO.)
22012 Деление по нулю Значение из арифметического выражения было возвращено, что привело к делении на нулю.

(Функция возвращает SQL_SUCCESS_WITH_INFO.)
22015 Переполнение поля интервала Назначение от точного числового или интервалного типа SQL к типу интервала C привело к потере значительных цифр в начале поля.

При получении данных в тип C интервала не было представления значения типа SQL в типе C интервала.

(Функция возвращает SQL_SUCCESS_WITH_INFO.)
22018 Недопустимое значение символа для спецификации приведения Тип C был точным или приблизительным числом, датой и временем или типом данных интервала; Тип SQL столбца — символьный тип данных; значение в столбце не является допустимым литералом привязанного типа C.

(Функция возвращает SQL_SUCCESS_WITH_INFO.)
24000 Недопустимое состояние курсора ОператорHandle находился в состоянии выполнения, но результирующий набор не был связан с оператором StatementHandle.
HY000 Общая ошибка Произошла ошибка, для которой не было определенного SQLSTATE и для которого не было определено значение SQLSTATE для конкретной реализации. Сообщение об ошибке, возвращаемое SQLError в буфере *MessageText , описывает ошибку и ее причину.
HY001 Ошибка выделения памяти Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции.
HY008 Операция отменена Асинхронная обработка была включена для ОператораHandle. Функция была вызвана и до завершения выполнения, SQLCancel или SQLCancelHandle была вызвана в операторе StatementHandle, а затем функция была вызвана снова на ОператорHandle.

Функция была вызвана и до завершения выполнения SQLCancel или SQLCancelHandle была вызвана оператором StatementHandle из другого потока в многопотоковом приложении.
HY010 Ошибка последовательности функций (DM) Асинхронно выполняющаяся функция была вызвана для дескриптора соединения, связанного с ОператоромHandle. Эта асинхронная функция по-прежнему выполнялась при вызове функции SQLExtendedFetch .

(DM) SQLExecute, SQLExecDirect или SQLMoreResults был вызван для ОператораHandle и возвращен SQL_PARAM_DATA_AVAILABLE. Эта функция была вызвана до получения данных для всех потоковых параметров.

(DM) Указанный оператор StatementHandle не находился в состоянии выполнения. Функция была вызвана без первого вызова SQLExecDirect, SQLExecute или функции каталога.

(DM) асинхронно выполняющаяся функция (не эта) была вызвана для StatementHandle и по-прежнему выполнялась при вызове этой функции.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations или SQLSetPos были вызваны для ОператораHandle и возвращены SQL_NEED_DATA. Эта функция была вызвана до отправки данных для всех параметров выполнения или столбцов.

(DM) SQLExtendedFetch был вызван для ИнструкцииHandle после вызова SQLFetch или SQLFetchScroll и до вызова SQLFreeStmt с параметром SQL_CLOSE.

(DM) SQLBulkOperations был вызван для инструкции до вызова SQLFetch, SQLFetchScroll или SQLExtendedFetch , а затем sqlExtendedFetch был вызван до вызова SQLFreeStmt с параметром SQL_CLOSE.
HY013 Ошибка управления памятью Не удалось обработать вызов функции, так как к базовым объектам памяти не удалось получить доступ, возможно, из-за низкой памяти.
HY106 Выборка типа вне диапазона (DM) Значение, указанное для аргумента FetchOrientation , было недопустимым. (См. комментарии.)

Аргумент FetchOrientation был SQL_FETCH_BOOKMARK, а для атрибута инструкции SQL_ATTR_USE_BOOKMARKS задано значение SQL_UB_OFF.

Значение параметра оператора SQL_CURSOR_TYPE было SQL_CURSOR_FORWARD_ONLY, а значение аргумента FetchOrientation не было SQL_FETCH_NEXT.

Аргумент FetchOrientation был SQL_FETCH_RESUME.
HY107 Значение строки вне диапазона Значение, указанное с параметром оператора SQL_CURSOR_TYPE, было SQL_CURSOR_KEYSET_DRIVEN, но значение, указанное атрибутом инструкции SQL_KEYSET_SIZE, было больше 0 и меньше значения, указанного атрибутом оператора SQL_ROWSET_SIZE.
HY111 Недопустимое значение закладки Аргумент FetchOrientation был SQL_FETCH_BOOKMARK, и закладка, указанная в аргументе FetchOffset , не была допустимой.
HY117 Подключение приостановлено из-за неизвестного состояния транзакции. Разрешены только функции отключения и только для чтения. (DM) Дополнительные сведения о приостановленном состоянии см. в статье SQLEndTran Function.
HYC00 Необязательный компонент не реализован Драйвер или источник данных не поддерживает указанный тип получения.

Драйвер или источник данных не поддерживает преобразование, указанное сочетанием TargetType в SQLBindCol и типом данных SQL соответствующего столбца. Эта ошибка применяется только в том случае, если тип данных SQL столбца сопоставлен с типом данных SQL для конкретного драйвера.
HYT00 Время ожидания истекло. Срок ожидания запроса истек, прежде чем источник данных вернул результирующий набор. Период времени ожидания задается через SQLSetStmtOption, SQL_QUERY_TIMEOUT.
HYT01 Время ожидания для подключения истекло Срок ожидания подключения истек до того, как источник данных ответил на запрос. Период времени ожидания подключения задается через SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Драйвер не поддерживает эту функцию (DM) Драйвер, связанный с StatementHandle , не поддерживает функцию.

Комментарии

Поведение SQLExtendedFetch идентично поведению SQLFetchScroll со следующими исключениями:

  • SQLExtendedFetch и SQLFetchScroll используют различные методы для возврата количества строк, извлекаемых. SQLExtendedFetch возвращает количество строк, извлекаемых в *RowCountPtr; SQLFetchScroll возвращает количество строк, извлекаемых непосредственно в буфер, на который указывает SQL_ATTR_ROWS_FETCHED_PTR. Дополнительные сведения см. в аргументе RowCountPtr .

  • SQLExtendedFetch и SQLFetchScroll возвращают состояние каждой строки в разных массивах. Дополнительные сведения см. в аргументе RowStatusArray .

  • SQLExtendedFetch и SQLFetchScroll используют различные методы для получения закладки при SQL_FETCH_BOOKMARK FetchOrientation . SQLExtendedFetch не поддерживает закладки переменной длины или извлекает наборы строк в смещение, отличное от 0 из закладки. Дополнительные сведения см. в аргументе FetchOffset .

  • SQLExtendedFetch и SQLFetchScroll используют разные размеры набора строк. SQLExtendedFetch использует значение атрибута инструкции SQL_ROWSET_SIZE, а SQLFetchScroll использует значение атрибута инструкции SQL_ATTR_ROW_ARRAY_SIZE.

  • SQLExtendedFetch имеет немного отличается от семантики обработки ошибок, чем SQLFetchScroll. Дополнительные сведения см. в разделе "Обработка ошибок" в разделе "Комментарии" SQLFetchScroll.

  • SQLExtendedFetch не поддерживает смещения привязки (атрибут инструкции SQL_ATTR_ROW_BIND_OFFSET_PTR).

  • Вызовы SQLExtendedFetch не могут быть смешанными с вызовами SQLFetch или SQLFetchScroll, и если sqlBulkOperations вызывается перед вызовом любой функции получения, sqlExtendedFetch не может вызываться, пока курсор не будет закрыт и вновь открыт. То есть SQLExtendedFetch можно вызывать только в состоянии инструкции S7. Дополнительные сведения см. в разделе "Переходы инструкций " в приложении B: таблицы перехода состояния ODBC.

Когда приложение вызывает SQLFetchScroll при использовании драйвера ODBC 2*.x*, диспетчер драйверов сопоставляет этот вызов с SQLExtendedFetch. Дополнительные сведения см. в разделе "Драйверы SQLFetchScroll и ODBC 2*.x* в SQLFetchScroll.

В ODBC 2*.x* вызов SQLExtendedFetch был вызван для получения нескольких строк и SQLFetch был вызван для получения одной строки. С другой стороны, в ODBC 3*.x* можно вызвать SQLFetch , чтобы получить несколько строк.

Сведения Раздел
Привязка буфера к столбцу в результирующем наборе Функция SQLBindCol
Выполнение операций массового вставки, обновления или удаления Функция SQLBulkOperations
Отмена обработки инструкций Функция SQLCancel
Возврат сведений о столбце в результирующем наборе Функция SQLDescribeCol
Выполнение инструкции SQL Функция SQLExecDirect
Выполнение подготовленной инструкции SQL Функция SQLExecute
Возврат числа столбцов результирующего набора Функция SQLNumResultCols
Размещение курсора, обновление данных в наборе строк или обновление или удаление данных в результирующем наборе Функция SQLSetPos
Задание атрибута инструкции Функция SQLSetStmtAttr

См. также

Справочник по API ODBC
Файлы заголовков ODBC