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 poskytují uživateli funkce, které v mnoha případech převyšují ty, jež poskytuje většina ovladačů ODBC první úrovně. Knihovna kurzorů ODBC se naštěstí vloží mezi databázové třídy a ovladač a automaticky poskytne většinu této dodatečné funkcionality.

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ů jsou aktualizace dle pozice. 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ů.

CDatabáze

Každý CDatabase přidělí jeden HDBC. Pokud se používá funkce CDatabaseExecuteSQL, je dočasně přidělen HSTMT. Pokud je tedy vyžadováno více CDatabase, musí být podporováno více HDBC na HENV.

Databázové třídy vyžadují knihovnu kurzorů. To se projeví ve volání SQLSetConnectionsSQL_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 byly transakce podporovány pro CDatabase a jeho závislé sady záznamů SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR, SQL_CURSOR_ROLLBACK_BEHAVIOR musí mít nastaveno 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 CDatabase otevřený jen pro čtení, bude se pokoušet nastavit zdroj dat na režim pouze pro čtení pomocí SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Pokud identifikátory vyžadují uvozování, tyto informace by měly být vráceny z ovladače při volání SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR.

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

SQLSetStmtOption SQL_QUERY_TIMEOUT a 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ělení a uvolnění dočasného HSTMT se uskutečňují volání ExecuteSQL, SQLExecDirect, SQLFetch a SQLNumResultCol. SQLCancel může být volána na HSTMT.

ZískatNázevDatabáze

SQLGetInfo SQL_DATABASE_NAME bude volán.

ZačítTransakci, PotvrditTransakci, VrátitZpět

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

CRecordsets

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

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

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í SQLGetData a SQL_LONG_VARBINARY dat se používají dvě volání. První volání se pokusí najít celkovou délku hodnoty sloupce voláním SQLGetData s cbMaxValue rovným 0, ale s platným pcbValue. Pokud pcbValue obsahuje SQL_NO_TOTAL, je vyvolána výjimka. V opačném případě je přidělen HGLOBAL a provede se další 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 SQL_LCK_EXCLUSIVE není podporován, bude vyvolána výjimka.

Pokusy o aktualizaci CRecordset (snímku nebo dynasetu) povedou k přidělení druhého HSTMT. U ovladačů, které nepodporují druhý HSTMT, bude knihovna kurzorů tuto funkci simulovat. Bohužel to může občas znamenat nutnost dokončit aktuální dotaz na prvním HSTMT ještě před zpracováním požadavku druhého HSTMT.

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

Pokud jsou v výstupních sloupcíchCLongBinarys, musí být podporována funkčnost ODBC DATA_AT_EXEC. To zahrnuje vrácení SQL_NEED_DATA z SQLExecDirect, SQLParamData a SQLPutData.

SQLRowCount je volána po spuštění, aby se ověřilo, že byl pomocí SQLExecDirect aktualizován pouze jeden záznam.

Kurzy 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.

Kursor sady dynamiky

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áno pesimistické uzamčení, bude provedeno volání SQLSetPos s irow 1, fRefresh FALSE a fLock SQL_LCK_EXCLUSIVE.

Viz také

Technické poznámky podle čísla
Technické poznámky podle kategorie