Бөлісу құралы:


Блочные курсоры, прокручиваемые курсоры и обратная совместимость для приложений ODBC 3.x

Существование SQLFetchScroll и SQLExtendedFetch представляет первое четкое разделение в ODBC между интерфейсом программирования приложений (API), который является набором функций вызовов приложений и интерфейса поставщика услуг (SPI), который является набором функций, которые реализует драйвер. Это разделение необходимо для балансировки требований в ODBC 3.x, которая использует SQLFetchScroll, чтобы соответствовать стандартам и быть совместимым с ODBC 2.x, который использует SQLExtendedFetch.

API ODBC 3.x , который является набором функций вызовов приложения, включает в себя SQLFetchScroll и связанные атрибуты инструкции. ИНТЕРФЕЙС SPI ODBC 3.x , который является набором функций, который реализует драйвер, включает в себя SQLFetchScroll, SQLExtendedFetch и связанные атрибуты инструкции. Так как ODBC официально не применяет это разделение между API и SPI, приложения ODBC 3.x могут вызывать атрибуты инструкции SQLExtendedFetch и связанные с ним атрибуты. Однако для этого нет причин для приложений ODBC 3.x . Дополнительные сведения об API и SPIS см. в статье об архитектуре ODBC.

Сведения о том, как диспетчер драйверов ODBC 3.x сопоставляет вызовы драйверов ODBC 2.x и ODBC 3.x, а также о том, какие функции и операторы атрибуты драйвера ODBC 3.x должны реализовывать для блокированных и прокручиваемых курсоров, см. в разделе "Что драйвер делает в приложении G: Рекомендации по драйверам для обратной совместимости".

В следующей таблице перечислены функции и атрибуты инструкции приложения ODBC 3.x , которые должны использоваться с блокируемыми и прокручиваемыми курсорами. В нем также перечислены изменения между ODBC 2.x и ODBC 3.x в этой области, которые приложения ODBC 3.x должны быть совместимы с драйверами ODBC 2.x.

Функция или

атрибут инструкции
Комментарии
SQL_ATTR_FETCH_BOOKMARK_PTR Указывает на закладку, используемую с SQLFetchScroll.

Если приложение устанавливает это в драйвере ODBC 2.x , это должно указывать на закладку фиксированной длины.
SQL_ATTR_ROW_STATUS_PTR Указывает на массив состояния строки, заполненный SQLFetch, SQLFetchScroll, SQLBulkOperations и SQLSetPos.

Если приложение задает это в драйвере ODBC 2.x и вызывает SQLBulkOperation с помощью операции SQL_ADD перед вызовом SQLFetchScroll, SQLFetch или SQLExtendedFetch, возвращается SQLSTATE HY011 (атрибут не может быть задан).

Когда приложение вызывает SQLFetch в драйвере ODBC 2.x, SQLFetch сопоставляется с SQLExtendedFetch и, следовательно, возвращает значения в этом массиве.
SQL_ATTR_ROWS_FETCHED_PTR Указывает на буфер, в котором SQLFetch и SQLFetchScroll возвращают количество строк, извлекаемых.

Когда приложение вызывает SQLFetch в драйвере ODBC 2.x, SQLFetch сопоставляется с SQLExtendedFetch и, следовательно, возвращает значение в этом буфере.
SQL_ATTR_ROW_ARRAY_SIZE Задает размер набора строк.

Если приложение вызывает SQLBulkOperations с операцией SQL_ADD в драйвере ODBC 2.x, SQL_ROWSET_SIZE будет использоваться для вызова, а не SQL_ATTR_ROW_ARRAY_SIZE, так как вызов сопоставляется с SQLSetPos с операцией SQL_ADD, которая использует SQL_ROWSET_SIZE.

Вызов SQLSetPos с операцией SQL_ADD или SQLExtendedFetch в драйвере ODBC 2.x использует SQL_ROWSET_SIZE.

Вызов SQLFetch или SQLFetchScroll в драйвере ODBC 2.x использует SQL_ATTR_ROW_ARRAY_SIZE.
SQLBulkOperations Выполняет операции вставки и закладки. Когда SQLBulkOperations с операцией SQL_ADD вызывается в драйвере ODBC 2.x , он сопоставляется с SQLSetPos с операцией SQL_ADD. Ниже приведены сведения о реализации.

— При работе с драйвером ODBC 2.x приложение должно использовать только неявно выделенный ARD, связанный с ОператоромHandle; он не может выделить еще один ARD для добавления строк, так как явные операции дескриптора не поддерживаются в драйвере ODBC 2.x . Приложение должно использовать SQLBindCol для привязки к ARD, а не SQLSetDescField или SQLSetDescRec.
— При вызове драйвера ODBC 3.x приложение может вызывать SQLBulkOperations с помощью операции SQL_ADD перед вызовом SQLFetch или SQLFetchScroll. При вызове драйвера ODBC 2.x приложение должно вызвать SQLFetchScroll перед вызовом SQLBulkOperations с помощью операции SQL_ADD.
SQLFetch Возвращает следующий набор строк. Ниже приведены сведения о реализации.

— Когда приложение вызывает SQLFetch в драйвере ODBC 2.x , оно сопоставляется с SQLExtendedFetch.
— Когда приложение вызывает SQLFetch в драйвере ODBC 3.x , оно возвращает количество строк, указанных атрибутом инструкции SQL_ATTR_ROW_ARRAY_SIZE.
SQLFetchScroll Возвращает указанный набор строк. Ниже приведены сведения о реализации.

— Когда приложение вызывает SQLFetchScroll в драйвере ODBC 2.x , оно возвращает SQLSTATE 01S01 (ошибка в строке) перед каждой ошибкой, которая применяется к одной строке. Это происходит только потому, что диспетчер драйверов ODBC 3.x сопоставляет это с SQLExtendedFetch и SQLExtendedFetch возвращает этот SQLSTATE. Когда приложение вызывает SQLFetchScroll в драйвере ODBC 3.x , оно никогда не возвращает SQLSTATE 01S01 (ошибка в строке).
— Когда приложение вызывает SQLFetchScroll в драйвере ODBC 2.x с параметром FetchOrientation, равным SQL_FETCH_BOOKMARK, аргумент FetchOffset должен иметь значение 0. Функция SQLSTATE HYC00 (необязательная функция не реализована) возвращается, если при попытке получения закладки на основе смещения используется драйвер ODBC 2.x .

Примечание.

Приложения ODBC 3.x не должны использовать SQLExtendedFetch или атрибут инструкции SQL_ROWSET_SIZE. Вместо этого они должны использовать SQLFetchScroll и атрибут инструкции SQL_ATTR_ROW_ARRAY_SIZE. Приложения ODBC 3.x не должны использовать SQLSetPos с операцией SQL_ADD, но следует использовать SQLBulkOperations с операцией SQL_ADD.