Эта записка описывает правила для писателей драйверов ODBC. В нем излагаются общие требования и предположений функциональность ODBC, которые делают классы MFC базы данных и различных ожидаемых семантической деталей. Описаны необходимые драйвера функциональность для поддержки трех CRecordset открытых режимов (forwardOnly, снимок и общий).
Библиотека курсоров ODBC
Классы MFC базы данных представляют функциональность для пользователей, которые во многих случаях превосходит функциональные возможности, предоставляемые большинство драйверов ODBC уровня 1. К счастью библиотека курсоров ODBC будет слой между классами базы данных и драйвера и автоматически обеспечит большую часть этой дополнительной функциональности.
К примеру большинство водителей 1.0 не поддерживают обратной прокрутки. Библиотека курсоров можно обнаружить это и будет кэшировать строки из водителя и представлять их в соответствии с просьбой на разговоры FETCH_PREV в SQLExtendedFetch.
Еще один важный пример зависимости библиотека курсоров — позиционированные обновления. Большинство водителей 1.0 также имеют позиционные обновления, но библиотека курсоров будет генерировать операторы update, которые идентифицируют целевой строки на источник данных, основанный на ее текущих кэшированных данных значений или значения кэшированного отметки времени.
Библиотека классов никогда не позволяет использовать несколько наборов строк. Таким образом несколько заявлений SQLSetPos всегда применяются к строке 1 набора строк.
CDatabases
Каждый CDatabase выделяет один HDBC. (Если используется функция ExecuteSQL CDatabase, HSTMT временно выделяется.) Поэтому если требуются несколько CDatabase, должен поддерживать несколько HDBCсек на HENV.
Классы базы данных требуют библиотеки курсоров. Это нашло свое отражение в вызове SQLSetConnections SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE используется CDatabase::Open для установления соединения с источником данных.
Водитель должен поддерживать SQLGetInfo SQL_ODBC_API_CONFORMANCE gt; = 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 попытка задать readonly источника данных будет производиться с SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
Если идентификаторы требуют цитируя, эти сведения должны быть возвращены из драйвера с вызовомSQL_IDENTIFIER_QUOTE_CHAR SQLGetInfo .
Для целей отладки, 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.
GetDatabaseName
SQLGetInfo SQL_DATABASE_NAME будет вызван.
Откат BeginTrans, CommitTrans,
SQLSetConnectOptionSQL_AUTOCOMMIT иSQL_COMMIT SQLTransact, SQL_ROLLBACK и SQL_AUTOCOMMIT будет вызван, если транзакция запросы делаются .
CRecordsets
SQLAllocStmt, SQLPrepare, SQLExecute (для открытых и повторный запрос), 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 (моментальный снимок или динамического) приведет к второй HSTMT выделения. Для водителей, которые не поддерживают второй HSTMTбиблиотека курсоров будут имитировать эту функциональность. К сожалению это может иногда означать, вынуждает текущий запрос на первом HSTMT до завершения перед обработкой запроса второй HSTMT.
Функцию SQLFreeStmt SQL_CLOSE и SQL_RESET_PARAMS и SQLGetCursorName будет вызываться во время операций обновления.
Если в outputColumns CLongBinarys , должен поддерживаться функциональность 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.
Динамическое подмножество курсоры
Ниже приведена минимальная поддержка, необходимая для открытия динамическое подмножество:
SQL&GetInfo SQL_ODBC_VER должна возвращать gt; «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 ложь и стадо SQL_LCK_EXCLUSIVE будет производиться.
Технические примечания по номеру |nbsp; Технические примечания по категориям