TN042: Рекомендации по разработке драйвера ODBC
Примечание |
---|
Следующая техническая заметка не была обновлена со времени сначала была включена в подключенной документации.В результате некоторые процедуры и разделы могут оказаться устаревшей или неверны.Последние новости, рекомендуется поиск раздела процента в подключенном индексу документации. |
Эта заметка описывает правила по писателей драйвера ODBC.Она конспектирует общие требования и допущения функций ODBC, что классы баз данных MFC, а также различные ожидаемых для семантических подробностей.Описывается требуемую функциональность драйвера для поддержки режима CRecordset открытых 3 (forwardOnly, Моментальный снимок и dynaset).
Библиотека курсоров ODBC
Классы баз данных MFC представляют функциональные возможности к пользователю, во многих случаях перегоняет функциональные возможности, предоставляемые большинство драйверов ODBC уровня 1.К счастью, библиотека курсоров ODBC наслоит между классами баз данных и драйвера, и предоставит многие из этой дополнительной функциональности.
Например, большинство 1.0 драйвер не поддерживает обратная прокрутку.Библиотека курсоров может определить это, а спрячет строки в кэше от драйвера и представляет их как в запросе на вызовах FETCH_PREV SQLExtendedFetch.
Другим важным примере зависимости библиотеки курсоров позиционированные обновления.Большая часть 1.0 драйвера также не имеет позиционированные обновления, но библиотека курсоров создаст выписки обновления, которые определяют строку целевого объекта в источнике данных, основанном на его кэшированных текущими значениями данных или кэшированное значение отметки времени.
Библиотека классов никогда не использует несколько наборов строк.Поэтому мало выписки SQLSetPos всегда применяются к строке 1 набора строк.
CDatabases
Каждое CDatabase выбирает один HDBC.(Если функция ExecuteSQL entity_CODECDatabase, HSTMT временно выбран). Если несколько entity_CODECDatabase необходимы, несколько HDBC в HENV должно поддерживаться.
Классы базы данных требуют библиотеки курсоров.Это отражается в вызов SQL_ODBC_CURSORSSQLSetConnections, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE используется CDatabase::Open для установления соединения с источником данных.
Драйвер должен поддерживать >= SQL_OAC_LEVEL1SQLGetInfoSQL_ODBC_API_CONFORMANCE, >= SQL_OSC_MINIMUMSQLGetInfoSQL_ODBC_SQL_CONFORMANCE.
Для транзакции для поддержки для CDatabase и его зависимых наборов записей, SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR и SQL_CURSOR_ROLLBACK_BEHAVIOR должны иметь SQL_CR_PRESERVE.В противном случае попытки выполнить управление транзакцией будут пропускаться.
SQL_DATA_SOURCE_READ_ONLYSQLGetInfo должен поддерживаться.Если он возвращает значение «y», то операции обновления не выполняются в источнике данных.
Если CDatabase открыть только для чтения, то попытка задать источник данных доступен только для чтения будет произведена с SQLSetConnectOptionSQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
Если необходимо заключать в кавычки идентификаторы, эти сведения должны быть возвращены от драйвера с помощью вызова SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR.
В целях отладки, SQLGetInfo SQL_DBMS_VER и SQL_DBMS_NAME получены от драйвера.
SQLSetStmtOptionSQL_QUERY_TIMEOUT и SQL_ASYNC_ENABLE могут быть вызваны на HDBC entity_CODECDatabase.
SQLError может вызываться с любым NULL аргументов.
Конечно, SQLAllocEnv, SQLAllocConnect, SQLDisconnect и SQLFreeConnect должно поддерживаться.
ExecuteSQL
Помимо выбора и освобождение временное HSTMT, ExecuteSQL вызывает SQLExecDirect, SQLFetch, SQLNumResultCol и SQLMoreResults.SQLCancel может быть вызван для HSTMT.
GetDatabaseName
SQLGetInfoSQL_DATABASE_NAME будет вызван метод.
BeginTrans, CommitTrans и rollback
Будут вызваны SQLSetConnectOptionSQL_AUTOCOMMIT и SQLTransactSQL_COMMIT, SQL_ROLLBACK и SQL_AUTOCOMMIT если запросы транзакции.
CRecordsets
SQLAllocStmt, SQLPrepare, SQLExecute (для Открыть и Requery), SQLExecDirect (для операций обновления), SQLFreeStmt должно поддерживаться.SQLNumResultCols и SQLDescribeCol будут вызваны на результирующем наборе в разное время.
SQLSetParam широко используется для привязки данных параметра и функциональность DATA_AT_EXEC.
SQLBindCol широко используется для регистрации места хранения данных выходного столбца с ODBC.
2 Вызова SQLGetData используемые для получения сведений о SQL_LONG_VARCHAR и SQL_LONG_VARBINARY.Попытки первого вызова найти общая длина значения столбцов путем вызова SQLGetData с cbMaxValue 0, но с допустимыми pcbValue.Если pcbValue содержит SQL_NO_TOTAL, возникает исключение.В противном случае - значение HGLOBAL установлен, а другой SQLGetData вызывается, чтобы получить весь результат.
Обновляется
Если пессимистическая запрашивается блокировка,SQL_LOCK_TYPESSQLGetInfo запроса.Если SQL_LCK_EXCLUSIVE не поддерживается, то будет вызвано исключение.
Пытается обновить CRecordset (Моментальный снимок или dynaset), могут секунду HSTMT быть выбран.Для драйверов, которые не поддерживают второй HSTMT библиотека курсоров сымитирует этой функциональности.К сожалению, это может означать, что принудительное иногда текущий запрос на первом HSTMT до завершения перед обработкой запроса второй ###HSTMT.
SQLFreeStmtSQL_CLOSE и SQL_RESET_PARAMS и SQLGetCursorName будут вызваны во время операций обновления.
Если CLongBinarys в outputColumns, функции ODBC DATA_AT_EXEC должен поддерживаться.Это включает возвращение SQL_NEED_DATA из SQLExecDirect, SQLParamData и SQLPutData.
SQLRowCount вызывается после выполнения, чтобы убедиться, что только 1 запись была обновлена SQLExecDirect.
Курсоры ForwardOnly
Только SQLFetch, необходимые для операций Переместить.Обратите внимание, что курсоры forwardOnly не поддерживают обновления.
Курсоры моментального снимка
Функциональные возможности моментального снимка требует поддержки SQLExtendedFetch.Как указано выше, библиотека курсоров ODBC обнаруживает когда драйвер не поддерживает SQLExtendedFetch и предоставляет необходимую поддержку.
SQLGetInfo, SQL_SCROLL_OPTIONS должен поддерживать SQL_SO_STATIC.
Курсоры динамического подмножества данных
Ниже приведены минимальные значения числа, что открытый динамическое подмножество данных:
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 и стая SQL_LCK_EXCLUSIVE.