共用方式為


狀態轉換

ODBC 會為每個環境、每個連線和每個陳述式定義離散狀態。 例如,環境有三種可能狀態:未配置 (其中未配置任何環境)、配置 (其中已配置環境,但未配置任何連線),以及連線 (其中已配置環境和一或多個連線)。 連線有七種可能狀態;陳述式有 13 種可能狀態。

當應用程式呼叫特定函式,並將控制代碼傳遞至該項目時,由其控制代碼識別的特定項目會從某個狀態轉移至另一個狀態。 此類轉移稱為狀態轉換。 例如,使用 SQLAllocHandle 配置環境控制代碼,會將環境從 [未配置] 轉移至 [已配置],而使用 SQLFreeHandle 釋放該控制代碼,則會將其從 [已配置] 傳回至 [未配置]。 ODBC 定義了有限數量的合法狀態轉換,這是必須按特定順序呼叫函式的另一種說法。

某些函式 (如 SQLGetConnectAttr) 完全不會影響狀態。 其他函式則會影響單一項目的狀態。 例如,SQLDisconnect 會將連線從 [連線] 狀態轉移至 [已配置] 狀態。 最後,某些函式會影響多個項目的狀態。 例如,使用 SQLAllocHandle 配置連線控制代碼會將連線從 [未配置] 狀態轉移至 [已配置] 狀態,並將環境從 [已配置] 狀態轉移至 [連線] 狀態。

如果應用程式未依序呼叫函式,函式會傳回狀態轉換錯誤。 例如,如果環境處於 [連線] 狀態,且應用程式使用該環境控制代碼呼叫 SQLFreeHandle,則 SQLFreeHandle 會傳回 SQLSTATE HY010 (函式序列錯誤),因其只能在環境處於 [已配置] 狀態時呼叫。 藉由將此定義為無效狀態轉換,ODBC 可防止應用程式在處於連線使用狀態時釋放環境。

在 ODBC 設計中,某些狀態轉換為固有設定。 例如,如果不先配置環境控制代碼,便無法配置連線控制代碼,因為配置連線控制代碼的函式需要環境控制代碼。 驅動程式管理員和驅動程式會強制執行其他狀態轉換。 例如,SQLExecute 會執行已備妥的陳述式。 如果傳遞給它的陳述式控制代碼未處於 [已備妥] 狀態,則 SQLExecute 會傳回 SQLSTATE HY010 (函式序列錯誤)。

從應用程式的角度來看,狀態轉換通常很簡單:合法狀態轉換往往與撰寫良好的應用程式流程密不可分。 驅動程式管理員和驅動程式的狀態轉換較為複雜,因為它們必須追蹤環境、每個連線和每個陳述式的狀態。 大部分工作都是由驅動程式管理員完成;驅動程式必須完成的大部分工作,都會與具有擱置結果的陳述式一起發生。

本手冊第 1 和第 2 部分 (「ODBC 簡介」和「開發應用程式和驅動程式」) 通常不會明確提及狀態轉換。 而是會描述必須呼叫函式的順序。 例如,「執行陳述式」指出必須先使用 SQLPrepare 準備陳述式,才能使用 SQLExecute 執行該陳述式。 如需狀態和狀態轉換的完整描述 (包括哪些轉換由驅動程式管理員檢查,又有哪些必須由驅動程式檢查),請參閱附錄 B:ODBC 狀態轉換資料表