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. (Если CDatabase
ExecuteSQL
используется функция, то 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 могут вызываться в CDatabase
HDBC.
SQLError
может вызываться с любым или всеми аргументами NULL.
Конечно, SQLAllocEnv
SQLAllocConnect
SQLDisconnect
и SQLFreeConnect
должны поддерживаться.
ExecuteSQL
Помимо выделения и освобождения временных HSTMT, вызовов SQLFetch
SQLExecDirect
и т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
, SQLPrepare
SQLExecute
(для Open
операций обновления) Requery
SQLExecDirect
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 будет выполнен.
См. также
Технические примечания по номеру
Технические примечания по категории