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


TN042. Рекомендации по драйверу ODBC для разработчиков

Примечание.

Следующее техническое примечание не было обновлено, поскольку сначала оно было включено в электронную документацию. В результате некоторые процедуры и разделы могут быть устаревшими или неверными. Для получения последних сведений рекомендуется выполнить поиск интересующей темы в алфавитном указателе документации в Интернете.

В этом примечании описаны рекомендации для записи драйверов ODBC. В нем описаны общие требования и предположения о функциональных возможностях ODBC, которые делают классы базы данных MFC и различные ожидаемые семантические сведения. Описаны необходимые функции драйвера для поддержки трех CRecordset режимов open (forwardOnly, snapshot и dynaset).

Библиотека курсоров ODBC

Классы базы данных MFC предоставляют пользователю функциональные возможности, которые во многих случаях превышают функциональные возможности, предоставляемые большинством драйверов ODBC уровня 1. К счастью, библиотека курсоров ODBC будет выложена между классами базы данных и драйвером, и автоматически предоставит большую часть этой дополнительной функциональности.

Например, большинство драйверов 1.0 не поддерживают обратную прокрутку. Библиотека курсоров может обнаружить это, и будет кэшировать строки от драйвера и представить их как запрошенные при FETCH_PREV вызовах SQLExtendedFetch.

Еще одним важным примером зависимости библиотеки курсоров является размещение обновлений. Большинство драйверов 1.0 также не имеют позиционированных обновлений, но библиотека курсоров создаст инструкции обновления, которые определяют целевую строку источника данных на основе текущих значений кэшированных данных или значения кэшированных меток времени.

Библиотека классов никогда не использует несколько наборов строк. Поэтому несколько SQLSetPos инструкций всегда применяются к строке 1 набора строк.

CDatabases

Каждый CDatabase выделяет один HDBC. (Если CDatabaseExecuteSQL используется функция, то HSTMT временно выделяется.) Поэтому, если требуется несколько CDatabaseэлементов, необходимо поддерживать несколько HDBCна HENV.

Для классов базы данных требуется библиотека курсоров. Это отражается в вызове SQLSetConnections SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.

SQLDriverConnect, SQL_DRIVER_COMPLETE используется CDatabase::Open для установления подключения к источнику данных.

Драйвер должен поддерживать SQLGetInfo SQL_ODBC_API_CONFORMANCE>= SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM.

Для поддержки транзакций для CDatabase наборов записей и зависимых наборов записей SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR SQL_CURSOR_ROLLBACK_BEHAVIOR должны быть SQL_CR_PRESERVE. В противном случае попытки управления транзакциями будут игнорироваться.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY необходимо поддерживать. Если он возвращает значение "Y", операции обновления не будут выполняться в источнике данных.

Если открыт CDatabase ReadOnly, попытка задать только чтение источника данных будет выполнена с SQLSetConnectOption SQL_ACCESS_MODEпомощью SQL_MODE_READ_ONLY.

Если идентификаторы требуют кавыкания, эти сведения должны быть возвращены из драйвера с вызовом SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR .

В целях SQLGetInfo SQL_DBMS_VER отладки и SQL_DBMS_NAME извлекаются из драйвера.

SQLSetStmtOption SQL_QUERY_TIMEOUTи SQL_ASYNC_ENABLE могут вызываться в CDatabaseHDBC.

SQLError может вызываться с любым или всеми аргументами NULL.

Конечно, SQLAllocEnvSQLAllocConnectSQLDisconnect и SQLFreeConnect должны поддерживаться.

ExecuteSQL

Помимо выделения и освобождения временных HSTMT, вызовов SQLFetchSQLExecDirectи тSQLNumResultCol. дSQLMoreResults. ExecuteSQL SQLCancel может вызываться в HSTMT.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME будет вызываться.

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMITи SQLTransact SQL_COMMIT, SQL_ROLLBACK и SQL_AUTOCOMMIT будут вызываться, если выполняются запросы транзакций.

CRecordsets

SQLAllocStmt, SQLPrepareSQLExecute (для Open операций обновления) RequerySQLExecDirect SQLFreeStmt должен поддерживаться. SQLNumResultCols и SQLDescribeCol будет вызываться в наборе результатов в разное время.

SQLSetParam широко используется для данных параметров привязки и DATA_AT_EXEC функциональных возможностей.

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

Два SQLGetData вызова используются для получения SQL_LONG_VARCHAR и SQL_LONG_VARBINARY данных. Первый вызов пытается найти общую длину значения столбца, вызвав SQLGetData cbMaxValue 0, но с допустимым pcbValue. Если pcbValue содержит SQL_NO_TOTAL, создается исключение. В противном случае выделяется HGLOBAL, а другой SQLGetData вызов, сделанный для получения всего результата.

Обновление

Если запрашивается пессимистичная блокировка, SQLGetInfo SQL_LOCK_TYPES запрос будет запрошен. Если SQL_LCK_EXCLUSIVE не поддерживается, создается исключение.

Попытки обновить CRecordset (моментальный снимок или dynaset) приведет к выделению второго HSTMT . Для драйверов, не поддерживающих второй HSTMT, библиотека курсоров имитирует эту функцию. К сожалению, иногда это может означать принудительное завершение текущего запроса HSTMT перед обработкой второго запроса HSTMT.

SQLFreeStmt SQL_CLOSE и SQL_RESET_PARAMS SQLGetCursorName и будут вызываться во время операций обновления.

Если в выходных данных есть CLongBinarys, необходимо поддерживать DATA_AT_EXEC функции ODBC. Это включает возврат SQL_NEED_DATA из SQLExecDirect, SQLParamData а также SQLPutData.

SQLRowCount вызывается после выполнения, чтобы убедиться, что обновлена SQLExecDirectтолько 1 запись.

Курсоры forwardOnly

Требуется только SQLFetch для операций Move . Обратите внимание, что курсоры forwardOnly не поддерживают обновления.

Курсоры моментальных снимков

Для работы с моментальным снимком требуется SQLExtendedFetch поддержка. Как отмечалось выше, библиотека курсоров ODBC определяет, когда драйвер не поддерживается SQLExtendedFetch, и обеспечивает необходимую поддержку.

SQLGetInfo, SQL_SCROLL_OPTIONS должна поддерживать SQL_SO_STATIC.

Курсоры Dynaset

Ниже приведена минимальная поддержка, необходимая для открытия dynaset:

SQLGetInfo, SQL_ODBC_VER должен возвращать > значение "01".

SQLGetInfo, SQL_SCROLL_OPTIONS должен поддерживать SQL_SO_KEYSET_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES должен возвращать "Y".

SQLGetInfo, SQL_POSITIONED_UPDATES должны поддерживать SQL_PS_POSITIONED_DELETE и SQL_PS_POSITIONED_UPDATE.

Кроме того, если запрашивается пессимистичная блокировка, вызов SQLSetPos с irow 1, fRefresh FALSE и fLock SQL_LCK_EXCLUSIVE будет выполнен.

См. также

Технические примечания по номеру
Технические примечания по категории