Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Следующая техническая заметка не была обновлена, так как она была впервые включена в онлайн-документацию. В результате некоторые процедуры и темы могут быть устаревшими или неверными. Для получения последних сведений рекомендуется искать интересующую тему в индексе веб-документации.
В этом примечании описаны рекомендации для записи драйверов 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, ExecuteSQL
вызывает SQLExecDirect
, SQLFetch
, SQLNumResultCol
и SQLMoreResults
.
SQLCancel
может вызываться в HSTMT.
ПолучитьИмяБазыДанных
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 данных. Первый вызов пытается определить полную длину значения в столбце, устанавливая 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
будут вызываться во время операций обновления.
Если в outputColumns есть CLongBinarys, необходимо поддерживать функциональность DATA_AT_EXEC ODBC. Это включает возврат SQL_NEED_DATA из SQLExecDirect
, SQLParamData
а также SQLPutData
.
SQLRowCount
вызывается после выполнения, чтобы убедиться, что обновлена только 1 запись SQLExecDirect
.
Курсоры только вперед
Требуется только 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.
См. также
Технические примечания по номеру
Технические заметки по категориям