驅動程式管理員在連線程序中的角色
請記住應用程式不會直接地呼叫驅動程式函式。 相反地,他們會使用相同的名稱呼叫 Driver Manager 函式,並且驅動程式管理員會呼叫驅動程式函式。 通常這幾乎會立即發生。 例如,應用程式會在驅動程式管理員呼叫 SQLExecute,並在進行一些錯誤檢查之後,驅動程式管理員會在驅動程式呼叫 SQLExecute 。
連線流程有所不同。 當應用程式使用 SQL_HANDLE_ENV 和 SQL_HANDLE_DBC 選項呼叫 SQLAllocHandle 時,函式只會在驅動程式管理員中配置控制代碼。 驅動程式管理員不會在驅動程式呼叫此函式,因為它不知道要呼叫哪一個驅動程式。 同樣地,如果應用程式將未連線的控制代碼傳給 SQLSetConnectAttr 或 SQLGetConnectAttr,則只有驅動程式管理員會執行函式。 在取得尚未設定且 ODBC 未定義預設值的屬性值時,它會從其連接控制代碼儲存或取得屬性值,並傳回 SQLSTATE 08003(Connection 未開啟)。
當應用程式呼叫 SQLConnect、 SQLDriverConnect 或 SQLBrowseConnect 時,驅動程式管理員會先判斷要使用的驅動程式。 然後,它會檢查驅動程式目前是否有連線載入:
如果無任何驅動程式有連線載入,驅動程式管理員會檢查指定的驅動程式是否載入相同環境中的另一個連線。 如果沒有,驅動程式管理員會在連線上載入驅動程式,並使用 SQL_HANDLE_ENV 選項呼叫驅動程式的 SQLAllocHandle 。
然後無論它是否剛載入,驅動程式管理員會使用 SQL_HANDLE_DBC 選項在驅動程式呼叫 SQLAllocHandle。 如果應用程式設定任何連線屬性,驅動程式管理員會在驅動程式中呼叫 SQLSetConnectAttr;如果發生錯誤,驅動程式管理員的連接函式會傳回 SQLSTATE IM006(Driver 的 SQLSetConnectAttr 失敗)。 最後,驅動程式管理員會在驅動程式呼叫連接函式。
如果在連線上載入指定的驅動程式,驅動程式管理員只會呼叫驅動程式的連接函式。 在此情況下,驅動程式必須確保連線上的所有連線屬性都會維持其目前的設定。
如果在連線上載入不同的驅動程式,驅動程式管理員會在驅動程式呼叫 SQLFreeHandle 以釋放連線。 如果沒有其他使用驅動程式的連線,驅動程式管理員會在驅動程式呼叫 SQLFreeHandle 以釋放環境並卸載驅動程式。 然後,驅動程式管理員會執行與在連線上未負載驅動程式時相同的作業。
當 HandleType 設定為 SQL_HANDLE_DBC 時,驅動程式管理員會在呼叫驅動程式的 SQLAllocHandle 和 SQLFreeHandle 之前,先鎖定環境控制代碼 (henv) 。
當應用程式呼叫 SQLDisconnect 時,驅動程式管理員會在驅動程式呼叫 SQLDisconnect。 不過,驅動程式會維持載入,以防應用程式重新連線至驅動程式。 當應用程式使用 SQL_HANDLE_DBC 選項呼叫 SQLFreeHandle 時,驅動程式管理員會在驅動程式呼叫 SQLFreeHandle。 如果驅動程式未由任何其他連線使用,則驅動程式管理員會使用 SQL_HANDLE_ENV 選項在驅動程式呼叫 SQLFreeHandle,並卸載驅動程式。