TN042: ODBC драйвер розробник рекомендації

Цієї записці описується керівні принципи для письменників драйвер ODBC. Це підкреслюється, загальні вимоги і припущень ODBC функціональні можливості, які класи MFC бази даних і очікувані семантичних докладні відомості. Описано функціональності необхідний драйвер для підтримки трьох CRecordset відкриті режимів (forwardOnly, знімок і динамічних бібліотек).

ODBC, бібліотеку курсора

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

Наприклад, більшість 1.0 драйвери не підтримують назад прокручування. Бібліотеку курсора може виявити це і буде кеш рядки з водієм і представити їх на прохання на FETCH_PREV дзвінки в SQLExtendedFetch.

Іншим важливим прикладом курсор бібліотеки залежності є позиціонується оновлення. Більшість водіїв 1.0 також не мають позиціонується оновлення, але бібліотеку курсора буде генерувати ДОПОВНЕНО заявами, які визначити цільової рядок на джерело даних, заснований на його поточне значення кешовані дані, або значення кешовані часової позначки.

Бібліотеки класів ніколи не дозволяє використовувати кілька rowsets. Таким чином, кілька SQLSetPos звітність завжди застосовуються до рядка 1 на набір рядків.

CDatabases

Кожен CDatabase виділяє одного HDBC. (Якщо використовується функція ExecuteSQL CDatabase, що HSTMT тимчасово виділяється.) Так що якщо вимагається кілька CDatabase, має підтримуватись кілька HDBCs за 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.

Якщо ідентифікатори вимагають, цитуючи, про це слід повернути з драйвера з на 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.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME буде називатися.

BeginTrans, CommitTrans, відкат

SQLSetConnectOption SQL_AUTOCOMMIT і SQLTransact SQL_COMMIT, 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 FALSE та стадо SQL_LCK_EXCLUSIVE буде зроблено.

Технічні примітки за номером |nbsp; Технічні примітки за категоріями

Index