Блочные курсоры, прокручиваемые курсоры и обратная совместимость для приложений 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.