ODBC 解決方案

然後,ODBC 如何標準化資料庫存取? 有兩個架構需求:

  • 應用程式必須能夠使用相同的原始程式碼來存取多個 DBMS,而不需重新編譯或重新連結。

  • 應用程式必須能夠同時存取多個 DBMS。

此外還有一個問題,因為市集實境:

  • ODBC 應該公開哪些 DBMS 功能? 只有所有 DBMS 通用的功能,或任何 DBMS 中可用的功能?

ODBC 會以下列方式解決這些問題:

  • ODBC 是呼叫層級介面。 若要解決應用程式如何使用相同原始程式碼存取多個 DBMS 的問題,ODBC 會定義標準 CLI。 這包含來自 Open Group 和 ISO/IEC 之 CLI 規格中的所有函式,並提供應用程式通常需要的其他功能。

    每個支援 ODBC 的 DBMS 都需要不同的程式庫或驅動程式。 驅動程式會在 ODBC API 中實作函式。 若要使用不同的驅動程式,應用程式不需要重新編譯或重新連結。 相反地,應用程式只會載入新的驅動程式,並呼叫其中函式。 若要同時存取多個 DBMS,應用程式會載入多個驅動程式。 支援驅動程式的方式是作業系統特定的。 例如,在 Microsoft® Windows ® 作業系統上,驅動程式是 (DLL) 動態連結程式庫。

  • ODBC 會定義標準SQL文法。 除了標準呼叫層級介面之外,ODBC 還會定義標準SQL文法。 此文法是以 Open Group SQL CAE 規格為基礎。 這兩個文法之間的差異很小,主要是因為內嵌SQL (開放式群組) 和 CLI (ODBC) 所需的SQL文法之間的差異。 文法也有一些延伸模組,可公開 Open Group 文法未涵蓋的常用語言功能。

    應用程式可以使用 ODBC 或 DBMS 特定的文法來提交語句。 如果語句使用與 DBMS 特定文法不同的 ODBC 文法,驅動程式會在將它傳送至資料來源之前先轉換它。 不過,這類轉換很少見,因為大部分 DBMS 都已經使用標準SQL文法。

  • ODBC 提供驅動程式管理員來管理同時存取多個 DBMS。 雖然使用驅動程式可解決同時存取多個 DBMS 的問題,但執行此動作的程式碼可能很複雜。 設計成使用所有驅動程式的應用程式無法以靜態方式連結到任何驅動程式。 相反地,它們必須在執行時間載入驅動程式,並透過函式指標的資料表呼叫它們中的函式。 如果應用程式同時使用多個驅動程式,這種情況會變得更複雜。

    ODBC 會提供驅動程式管理員,而不是強制每個應用程式執行此動作。 驅動程式管理員會實作所有 ODBC 函式,主要是作為驅動程式中 ODBC 函式的傳遞呼叫,並以靜態方式連結至應用程式,或在執行時間由應用程式載入。 因此,應用程式會依名稱在驅動程式管理員中呼叫 ODBC 函式,而不是依每個驅動程式中的指標呼叫。

    當應用程式需要特定驅動程式時,它會先要求用來識別驅動程式的連線控制碼,然後要求驅動程式管理員載入驅動程式。 驅動程式管理員會載入驅動程式,並將每個函式的位址儲存在驅動程式中。 若要在驅動程式中呼叫 ODBC 函式,應用程式會在驅動程式管理員中呼叫該函式,並傳遞驅動程式的連接控制碼。 然後,驅動程式管理員會使用稍早儲存的位址來呼叫 函式。

  • ODBC 會公開大量的 DBMS 功能,但不需要驅動程式來支援所有這些功能。 如果 ODBC 只公開所有 DBMS 通用的功能,則很少使用;畢竟,現今有許多不同的 DBMS 存在的原因是它們有不同的功能。 如果 ODBC 公開任何 DBMS 中可用的每項功能,驅動程式將無法實作。

    相反地,ODBC 會公開大量的功能,但大部分 DBMS 都支援更多功能,但需要驅動程式只實作這些功能的子集。 只有在基礎 DBMS 支援這些功能,或選擇模擬它們時,驅動程式才會實作其餘的功能。 因此,您可以撰寫應用程式來利用該 DBMS 驅動程式公開的單一 DBMS 功能、只使用所有 DBMS 所使用的功能,或檢查特定功能的支援並據以回應。

    因此,應用程式可以判斷驅動程式和 DBMS 支援的功能,ODBC 提供兩個函式 (SQLGetInfoSQLGetFunctions) ,傳回驅動程式支援的一般資訊以及驅動程式支援的函式清單。 ODBC 也會定義 API 和SQL文法一致性層級,以指定驅動程式支援的各種功能。 如需詳細資訊,請參閱 一致性層級

    請務必記住,ODBC 會為其公開的所有功能定義通用介面。 因此,應用程式包含功能特定的程式碼,而非 DBMS 特定程式碼,而且可以使用任何公開這些功能的驅動程式。 其中一個優點是,當 DBMS 支援的功能增強時,不需要更新應用程式;相反地,安裝更新的驅動程式時,應用程式會自動使用功能,因為其程式碼是特定功能,而不是驅動程式特定或 DBMS 特定。