Sdílet prostřednictvím


TN042: Doporučení pro vývojáře ovladačů ODBC

Poznámka

Následující technická poznámka se od prvního zahrnutí do online dokumentace neaktualizovala. V důsledku toho můžou být některé postupy a témata zastaralé nebo nesprávné. Nejnovější informace doporučujeme vyhledat v online indexu dokumentace, které vás zajímá.

Tato poznámka popisuje pokyny pro zapisovače ovladačů ODBC. Popisuje obecné požadavky a předpoklady funkce ODBC, které tvoří databázové třídy MFC, a různé očekávané sémantické podrobnosti. Jsou popsány požadované funkce ovladače pro podporu tří CRecordset režimů Open (forwardOnly, snapshot a dynaset).

Knihovna kurzorů ODBC

Třídy databáze MFC představují funkce uživateli, který v mnoha případech překračuje funkce poskytované většinou ovladačů ODBC úrovně 1. Knihovna kurzorů odbc naštěstí bude vrstvit sama sebe mezi databázové třídy a ovladač a automaticky poskytne většinu této další funkce.

Například většina ovladačů 1,0 nepodporuje zpětné posouvání. Knihovna kurzorů to dokáže rozpoznat a uloží řádky z ovladače do mezipaměti a zobrazí je podle požadavků na FETCH_PREV volání .SQLExtendedFetch

Dalším důležitým příkladem závislosti na knihovně kurzorů je umístění aktualizací. Většina ovladačů 1.0 také nemá umístěné aktualizace, ale knihovna kurzoru vygeneruje aktualizační příkazy, které identifikují cílový řádek zdroje dat na základě aktuálních hodnot dat uložených v mezipaměti nebo hodnoty časového razítka v mezipaměti.

Knihovna tříd nikdy nepoužívá více sad řádků. Proto se několik SQLSetPos příkazů vždy použije na řádek 1 sady řádků.

Databáze CDatabase

Každý z nich CDatabase přidělí jeden HDBC. (Pokud CDatabaseExecuteSQL se používá funkce HSTMT, je dočasně přidělena.) Pokud tedy potřebujete víceCDatabase, musí být podporováno více HDBCna HENV.

Databázové třídy vyžadují knihovnu kurzorů. To se projeví ve SQLSetConnections volání SQL_ODBC_CURSORS SQL_CUR_USE_ODBC.

SQLDriverConnect, SQL_DRIVER_COMPLETE slouží CDatabase::Open k navázání připojení ke zdroji dat.

Ovladač musí podporovat SQLGetInfo SQL_ODBC_API_CONFORMANCE>= SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM.

Aby transakce byly podporovány pro CDatabase závislé sady záznamů SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR a SQL_CURSOR_ROLLBACK_BEHAVIOR musí mít SQL_CR_PRESERVE. V opačném případě budou pokusy o provedení řízení transakcí ignorovány.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY musí být podporováno. Pokud vrátí hodnotu "Y", ve zdroji dat se neprovedou žádné operace aktualizace.

Pokud je otevřen readOnlyCDatabase, pokusí se nastavit zdroj dat jen pro čtení s SQLSetConnectOption SQL_ACCESS_MODESQL_MODE_READ_ONLY.

Pokud identifikátory vyžadují uvozování, měly by se tyto informace vrátit z ovladače s voláním SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR .

Pro účely SQLGetInfo SQL_DBMS_VER ladění a SQL_DBMS_NAME se načtou z ovladače.

SQLSetStmtOption SQL_QUERY_TIMEOUTa SQL_ASYNC_ENABLE mohou být volána na CDatabaseHDBC.

SQLError může být volána s libovolnými nebo všemi argumenty NULL.

Samozřejmě , SQLAllocEnvSQLAllocConnectSQLDisconnect a SQLFreeConnect musí být podporován.

Executesql

Kromě přidělování a uvolnění dočasné HSTMT, ExecuteSQL volání SQLExecDirect, SQLFetcha SQLNumResultCol SQLMoreResults. SQLCancel může být volána v HSTMT.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME bude volána.

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMIT a SQLTransact SQL_COMMIT, SQL_ROLLBACK a SQL_AUTOCOMMIT budou volána, pokud jsou provedeny žádosti o transakce.

CRecordsets

SQLAllocStmtSQLExecute , SQLPrepare( Pro Open a Requery), SQLExecDirect (pro operace aktualizace) SQLFreeStmt musí být podporována. SQLNumResultCols a SQLDescribeCol bude volána na základě výsledků nastavených v různých časech.

SQLSetParam se používá široce pro vazby dat parametrů a DATA_AT_EXEC funkce.

SQLBindCol se používá ve velkém rozsahu k registraci umístění úložiště dat výstupního sloupce pomocí rozhraní ODBC.

K načtení SQL_LONG_VARCHAR a SQL_LONG_VARBINARY dat se používají dvě SQLGetData volání. První volání se pokusí najít celkovou délku hodnoty sloupce voláním SQLGetData cbMaxValue z 0, ale s platným pcbValue. Pokud pcbValue drží SQL_NO_TOTAL, je vyvolána výjimka. V opačném případě je přidělen HGLOBAL a další SQLGetData volání k načtení celého výsledku.

Aktualizace

Pokud se požaduje pesimistické zamykání, SQLGetInfo SQL_LOCK_TYPES bude dotazován. Pokud se SQL_LCK_EXCLUSIVE nepodporuje, vyvolá se výjimka.

Pokusy o aktualizaci CRecordset (snímku nebo dynasetu) způsobí přidělení druhého HSTMT . U ovladačů, které nepodporují druhý HSTMT, bude knihovna kurzorů tuto funkci simulovat. To bohužel může někdy znamenat vynucení aktuálního dotazu na první HSTMT k dokončení před zpracováním druhého požadavku HSTMT.

SQLFreeStmt SQL_CLOSE a SQL_RESET_PARAMS a SQLGetCursorName bude volána během operací aktualizace.

Pokud jsou ve výstupním objektu CLongBinarys, musí být podporované funkce rozhraní ODBC DATA_AT_EXEC. To zahrnuje vrácení SQL_NEED_DATA z SQLExecDirecta SQLParamData SQLPutData.

SQLRowCount je volána po spuštění k ověření, zda byl aktualizován SQLExecDirectpouze 1 záznam .

Kurzory forwardOnly

Vyžaduje se pouze SQLFetch pro Move operace. Mějte na paměti, že kurzory forwardOnly nepodporují aktualizace.

Snímkové kurzory

Funkce snímků vyžaduje SQLExtendedFetch podporu. Jak je uvedeno výše, knihovna kurzorů ODBC zjistí, kdy ovladač nepodporuje SQLExtendedFetch, a poskytne potřebnou podporu sám.

SQLGetInfo, SQL_SCROLL_OPTIONS musí podporovat SQL_SO_STATIC.

Kurzory dynasetu

Níže je minimální podpora potřebná k otevření dynasetu:

SQLGetInfo, SQL_ODBC_VER musí vrátit > hodnotu 01.

SQLGetInfo, SQL_SCROLL_OPTIONS musí podporovat SQL_SO_KEYSET_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES musí vrátit "Y".

SQLGetInfo, SQL_POSITIONED_UPDATES musí podporovat SQL_PS_POSITIONED_DELETE a SQL_PS_POSITIONED_UPDATE.

Kromě toho, pokud je požadován pesimistické uzamčení, bude provedeno volání SQLSetPos s irow 1, fRefresh FALSE a fLock SQL_LCK_EXCLUSIVE .

Viz také

Technické poznámky podle čísel
Technické poznámky podle kategorií