TN042: Doporučení pro vývojáře ovladačů ODBC
[!POZNÁMKA]
Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato poznámka popisuje pokyny pro autory ovladač ODBC.Obsahuje také stručný obecné požadavky a předpoklady vytvořit třídy databáze knihovny MFC rozhraní ODBC funkce a detailní očekávané sémantické informace.Požadovaná funkce ovladače pro podporu tří CRecordset otevřete režimy (forwardOnly, snímek a Dynamická sada) jsou popsány.
Knihovna kurzorů ODBC
Třídy databáze knihovny MFC obsahují funkce pro uživatele, který v mnoha případech překročí funkce poskytované Většina ovladačů rozhraní ODBC úrovně 1.Knihovna kurzorů rozhraní ODBC je naštěstí samotné vrstvy mezi třídami databáze a ovladačem a automaticky poskytne velkou část této další funkce.
Například většina 1.0 ovladače nepodporují posouvání dozadu.Knihovna kurzorů můžete zjistit a bude ukládat do mezipaměti řádky z ovladače a prezentovat, jak je požadováno na volání FETCH_PREV v SQLExtendedFetch.
Další důležitý příklad závislost knihovna kurzorů je umístěné aktualizace.Většina ovladačů 1.0 také nemají umístěné aktualizace, ale knihovna kurzorů bude generovat příkazy aktualizace, které identifikaci cílového řádku ve zdroji dat na základě aktuální hodnoty data uložená v mezipaměti nebo hodnotu časového razítka v mezipaměti.
Knihovna tříd nikdy využívá více sad řádků.Proto několik SQLSetPos příkazy jsou použita vždy řádek 1 sady řádků.
CDatabases
Každý CDatabase přiděluje jediné HDBC. (Pokud CDatabasena ExecuteSQL při použití funkce HSTMT dočasně přidělen.) Ano, pokud je více CDatabaseje vyžadováno, více HDBCs za HENV musí být podporována.
Databázové třídy vyžadují knihovnu kurzorů.To se odráží v SQLSetConnections volat SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE používá CDatabase::Open k navázání připojení ke zdroji dat.
Ovladač musí podporovat SQLGetInfoSQL_ODBC_API_CONFORMANCE>= SQL_OAC_LEVEL1, SQLGetInfoSQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM.
V pořadí pro transakce, které mají být podporovány u CDatabase a jeho sady záznamů závislých SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR a SQL_CURSOR_ROLLBACK_BEHAVIOR musí mít SQL_CR_PRESERVE. Pokusy o provedení transakce řízení jinak, budou ignorovány.
SQLGetInfoSQL_DATA_SOURCE_READ_ONLY musí být podporována. "Y", vrátí-li žádné operace aktualizace budou provedeny ve zdroji dat.
Pokud CDatabase je otevřen jen pro čtení, nastavení zdroje dat, přečtěte si pouze se pokusí s SQLSetConnectOptionSQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
Vyžadují-li identifikátory citací, tato informace by měla být vrácena z ovladače s SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR volání.
Pro účely ladění SQLGetInfo SQL_DBMS_VER a SQL_DBMS_NAME jsou načteny z ovladače.
SQLSetStmtOptionSQL_QUERY_TIMEOUT a SQL_ASYNC_ENABLE může být volána na CDatabasena HDBC.
Funkce SQLError může být volána s některé nebo všechny parametry NULL.
Samozřejmě SQLAllocEnv, SQLAllocConnect, SQLDisconnect a provedeny příkazy SQLFreeConnect musí být podporována.
ExecuteSQL
Přidělení a uvolnění dočasný HSTMT, ExecuteSQL volání funkce SQLExecDirect, SQLFetch, SQLNumResultCol a SQLMoreResults.SQLCancel může být volána na HSTMT.
GetDatabaseName
SQLGetInfoSQL_DATABASE_NAME bude volána.
BeginTrans CommitTrans, vrácení zpět
SQLSetConnectOptionSQL_AUTOCOMMIT a SQLTransactSQL_COMMIT, SQL_ROLLBACK a SQL_AUTOCOMMIT bude volána, pokud jsou kladeny požadavky transakce.
CRecordsets
SQLAllocStmt, funkce SQLPrepare, SQLExecute (pro Otevřít a Requery), funkce SQLExecDirect (pro operace aktualizace), SQLFreeStmt musí být podporována.SQLNumResultCols a zda bude volat pro výsledky nastavit v různých časech.
SQLSetParam se velmi často používá pro vázání dat parametru a DATA_AT_EXEC funkce.
SQLBindCol se velmi často používá k registraci výstupní sloupec umístění úložiště dat s rozhraním ODBC.
Dva SQLGetData volání slouží k načtení SQL_LONG_VARCHAR a SQL_LONG_VARBINARY data.První volání pokusí najít celkové délky sloupec hodnoty voláním SQLGetData s cbMaxValue 0, ale s platnou pcbValue.Pokud obsahuje pcbValue SQL_NO_TOTAL, je vyvolána výjimka.Jinak HGLOBAL je přidělen a jiné SQLGetData volání k načtení celý výsledek.
Aktualizování
Pokud je požadováno pesimistické zamykání, SQLGetInfoSQL_LOCK_TYPES dotaz bude odeslán. Pokud SQL_LCK_EXCLUSIVE je nepodporuje, bude vyvolána výjimka.
Pokusí aktualizovat CRecordset (snímek nebo Dynamická sada) způsobí, že druhý HSTMT má být přidělen.Ovladače, které nepodporují druhý HSTMT, knihovna kurzorů bude simulovat tuto funkci.Bohužel, to může někdy znamenat vynucení aktuální dotaz na první HSTMT až do ukončení před zpracováním druhé HSTMTpožadavku uživatele.
SQLFreeStmtSQL_CLOSE a SQL_RESET_PARAMS a SQLGetCursorName bude volána během operace aktualizace.
Pokud jsou CLongBinarys v outputColumns, ODBC DATA_AT_EXEC funkce musí být podporována.Jedná se o vrácení SQL_NEED_DATA z funkce SQLExecDirect, SQLParamData a SQLPutData.
SQLRowCount je volána po provedení ověření, že byla aktualizována pouze jeden záznam funkce SQLExecDirect.
Kurzory ForwardOnly
Pouze SQLFetch je nutné Přesunout operace.Všimněte si, že forwardOnly kurzory nepodporují aktualizaci.
Snímek kurzory
Funkce snímek vyžaduje SQLExtendedFetch podporu.Jak bylo uvedeno výše, bude knihovna kurzorů rozhraní ODBC rozpoznat, kdy ovladač nepodporuje SQLExtendedFetcha poskytovat nezbytnou podporu sám.
SQLGetInfo, SQL_SCROLL_OPTIONS musí podporovat SQL_SO_STATIC.
Dynamická sada kurzory
Dále je nutné otevřít dynamickou sadu minimální podporu:
SQLGetInfo, SQL_ODBC_VER musí vrátit > "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é zamykání volání SQLSetPos irow 1, fRefresh hodnotu FALSE a hejna SQL_LCK_EXCLUSIVE budou provedeny.