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 (Open Group) 和 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),以傳回驅動程式和 DBMS 功能的相關一般資訊,以及驅動程式支援的函式清單。 ODBC 也會定義 API 和 SQL 文法一致性層級,以指定驅動程式支援的各種功能。 如需詳細資訊,請參閱一致性層級

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