Psaní aplikací ODBC 3.x

Když je aplikace ODBC 2.x upgradována na ODBC 3.x, měla by být zapsána tak, aby fungovala s ovladači ODBC 2.x i 3.x . Aplikace by měla začlenit podmíněný kód, aby plně využila výhod funkcí ODBC 3.x .

Atribut prostředí SQL_ATTR_ODBC_VERSION by měl být nastavený na SQL_OV_ODBC2. Tím zajistíte, že se ovladač chová jako ovladač ODBC 2.x s ohledem na změny popsané v části Změny chování.

Pokud aplikace použije některou z funkcí popsaných v části Nové funkce, podmíněný kód by měl být použit k určení, zda je ovladač ODBC 3.x nebo ODBC 2.x ovladač. Aplikace používá SQLGetDiagField a SQLGetDiagRec k získání ODBC 3.x SQLSTATEs při zpracování chyb u těchto fragmentů podmíněného kódu. Měli byste zvážit následující body týkající se nových funkcí:

  • Aplikace ovlivněná změnou velikosti sady řádků by měla být opatrní, aby nezavolala funkci SQLFetch , pokud je velikost pole větší než 1. Tyto aplikace by měly nahradit volání SQLExtendedFetch voláním SQLSetStmtAttr nastavit atribut příkazu SQL_ATTR_ARRAY_STATUS_PTR a SQLFetchScroll, aby měly společný kód, který funguje s ovladači ODBC 3.x i ODBC 2.x . Vzhledem k tomu, že SQLSetStmtAttr s SQL_ATTR_ROW_ARRAY_SIZE bude mapován na SQLSetStmtAttr s SQL_ROWSET_SIZE pro ovladače ODBC 2.x, mohou aplikace jednoduše nastavit SQL_ATTR_ROW_ARRAY_SIZE pro své operace načítání více řádků.

  • Většina aplikací, které upgradují, nejsou ve skutečnosti ovlivněny změnami v kódech SQLSTATE. U ovlivněných aplikací mohou ve většině případů mechanicky hledat a nahrazovat pomocí tabulky převodu chyb v části "Mapování SQLSTATE" pro převod kódů chyb ODBC 3.x na kódy ODBC 2.x. Vzhledem k tomu, že správce ovladačů ODBC 3.x bude provádět mapování z ODBC 2.x SQLSTATEs na ODBC 3.x SQLSTATEs, programátoři aplikací musí kontrolovat pouze ODBC 3.x SQLSTATEs a nemusí se starat o zahrnutí ODBC 2.x SQLSTATEs v podmíněném kódu.

  • Pokud aplikace velmi dobře využívá datové typy data, času a časového razítka, může se deklarovat jako aplikace ODBC 2.x a používat svůj stávající kód místo podmíněného kódu.

Upgrade by měl zahrnovat také následující kroky:

  • Před přidělením připojení zavolejte SQLSetEnvAttr a nastavte atribut prostředí SQL_ATTR_ODBC_VERSION na SQL_OV_ODBC2.

  • Nahraďte všechna volání sqlAllocEnv, SQLAllocConnect nebo SQLAllocStmt voláním sqlAllocHandle odpovídajícím argumentem HandleType SQL_HANDLE_ENV, SQL_HANDLE_DBC nebo SQL_HANDLE_STMT.

  • Nahraďte všechna volání SQLFreeEnv nebo SQLFreeConnect voláním SQLFreeHandle odpovídajícím argumentem HandleType SQL_HANDLE_DBC nebo SQL_HANDLE_STMT.

  • Nahraďte všechna volání sqlSetConnectOption voláními sqlSetConnectAttr. Pokud nastavíte atribut, jehož hodnota je řetězec, nastavte argument StringLength odpovídajícím způsobem. Změňte argument atributu z SQL_XXXX na SQL_ATTR_XXXX.

  • Nahraďte všechna volání sqlGetConnectOption voláními SQLGetConnectAttr. Pokud získáváte řetězec nebo binární atribut, nastavte BufferLength na příslušnou hodnotu a předejte argument StringLength . Změňte argument atributu z SQL_XXXX na SQL_ATTR_XXXX.

  • Nahraďte všechna volání sqlSetStmtOption voláními SQLSetStmtAttr. Pokud nastavíte atribut, jehož hodnota je řetězec, nastavte argument StringLength odpovídajícím způsobem. Změňte argument atributu z SQL_XXXX na SQL_ATTR_XXXX.

  • Nahraďte všechna volání sqlGetStmtOption voláními SQLGetStmtAttr. Pokud získáváte řetězec nebo binární atribut, nastavte BufferLength na příslušnou hodnotu a předejte argument StringLength . Změňte argument atributu z SQL_XXXX na SQL_ATTR_XXXX.

  • Nahraďte všechna volání sqlTransact voláním sqlEndTran. Pokud je nejpravější platný popisovač ve volání SQLTransact popisovačem prostředí, měl by být ve volání SQLEndTran použit argument HandleType SQL_HANDLE_ENV s odpovídajícím argumentem Handle. Pokud je nejpravější platný popisovač ve volání SQLTransact popisovačem připojení, je třeba ve volání SQLEndTran použít argument HandleType SQL_HANDLE_DBC s odpovídajícím argumentem Popisovač.

  • Nahraďte všechna volání sqlColAttributes voláním SQLColAttribute. Pokud je argument FieldIdentifier buď SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE nebo SQL_COLUMN_LENGTH, neměňte nic jiného než název funkce. Pokud ne, změňte FieldIdentifier z SQL_COLUMN_XXXX na SQL_DESC_XXXX. Pokud je FieldIdentifier SQL_DESC_CONCISE_TYPE a datový typ je typu datetime, změňte na odpovídající datový typ ODBC 3.x.

  • Pokud používáte blokové kurzory, posouvání kurzorů nebo obojí, aplikace provede následující kroky:

    • Nastaví velikost sady řádků, typ kurzoru a souběžnost kurzoru pomocí sqlSetStmtAttr.

    • Volá SQLSetStmtAttr k nastavení SQL_ATTR_ROW_STATUS_PTR k odkazování na pole záznamů stavu.

    • Volá SQLSetStmtAttr, aby nastavil SQL_ATTR_ROWS_FETCHED_PTR, aby ukazoval na SQLINTEGER.

    • Provede požadované vazby a spustí příkaz SQL.

    • Volá SQLFetchScroll ve smyčce pro načítání řádků a pohyb v sadě výsledků.

    • Pokud chce načíst pomocí záložky, aplikace volá SQLSetStmtAttr, aby nastavila SQL_ATTR_FETCH_BOOKMARK_PTR do proměnné, která bude obsahovat záložku pro řádek, který chce načíst, a volá SQLFetchScroll s argumentem FetchOrientation nastaveným na SQL_FETCH_BOOKMARK.

  • Pokud používáte pole parametrů, aplikace provede následující:

    • Volá SQLSetStmtAttr k nastavení atributu SQL_ATTR_PARAMSET_SIZE na velikost pole parametrů.

    • Volá sqlSetStmtAttr nastavit SQL_ATTR_ROWS_PROCESSED_PTR odkazovat na interní proměnnou UDWORD.

    • Provede podle potřeby operace přípravy, propojení a spuštění.

    • Pokud se provádění z nějakého důvodu zastaví (například SQL_NEED_DATA), může najít "aktuální" řádek parametrů kontrolou umístění, na které odkazuje SQL_ATTR_ROWS_PROCESSED_PTR.

Tato část obsahuje následující témata.