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 CDatabase
ExecuteSQL
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_MODE
SQL_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_TIMEOUT
a SQL_ASYNC_ENABLE mohou být volána na CDatabase
HDBC.
SQLError
může být volána s libovolnými nebo všemi argumenty NULL.
Samozřejmě , SQLAllocEnv
SQLAllocConnect
SQLDisconnect
a SQLFreeConnect
musí být podporován.
Executesql
Kromě přidělování a uvolnění dočasné HSTMT, ExecuteSQL
volání SQLExecDirect
, SQLFetch
a 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
SQLAllocStmt
SQLExecute
, 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 SQLExecDirect
a SQLParamData
SQLPutData
.
SQLRowCount
je volána po spuštění k ověření, zda byl aktualizován SQLExecDirect
pouze 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í