
如果你每天都要處理數據,遲早會遇到令人頭痛的縮寫 ODBC,很多人可能都會好奇它到底是做什麼用的。 ODBC是一種默默無聞的標準,它允許截然不同的應用程式和資料庫相互通信,而無需每次更換服務提供者時重寫所有程式碼。
儘管如今已有更新的技術,但 ODBC 在許多環境中仍然至關重要:從Excel 或 Access 等辦公室工具,到 Tableau 或 Qlik Sense 等 BI 解決方案,再到仍在處理關鍵數據的傳統企業應用程序,ODBC 都扮演著關鍵角色。讓我們深入了解 ODBC 的定義、用途、內部工作原理以及實際配置方法。
什麼是ODBC?它究竟有什麼用途?
ODBC 代表開放資料庫連線(Open Database Connectivity)。它是一個開放標準的應用程式介面(API),旨在以統一的方式存取資料庫,而無需考慮底層資料庫管理系統(DBMS)。
這個想法簡單卻無比強大:你只需編寫一次應用程序,使用 ODBC 呼叫和標準 SQL 語句,然後讓驅動程式處理與各個資料庫「原生語言」的互動。這樣,你就可以在 Access 和 SQL Server、MySQL 和 Oracle,甚至簡單的文字檔案之間輕鬆切換,而無需重寫所有資料存取邏輯。
ODBC充當客戶端應用程式和資料庫管理系統(DBMS)之間的橋樑。應用程式使用ODBC API發送SQL請求,驅動程式將這些請求轉換為特定DBMS能夠理解的格式,並將結果傳回給應用程式。這使得程式無需了解每個資料庫的專有特性。
該標準起源於 20 世紀 90 年代初的 SQL Access Group,微軟是Windows系統的主要推動者,其首個驅動程式是 SIMBA.DLL(於 1992 年與 Simba 共同開發)。如今,ODBC 已在 Windows、 UNIX、Linux、OS/2 和 macOS 等平台實現,使其成為廣泛使用的跨平台解決方案。
ODBC 的歷史與演變
ODBC 的發展歷程與微軟環境下的資料存取演進以及開放標準密切相關。 ODBC基於 The Open Group 和 ISO/IEC 聯合發布的 SQL 呼叫級介面 (CLI) 規範,該規範定義了資料庫存取 API 在呼叫層級的設計方式。
ODBC 的第一個版本於 1992 年 9 月發布(ODBC 1.0) 。隨後的版本增加了新功能並提高了效能:ODBC 2.0(約 1994 年)、2.5、ODBC 3.0(約 1995 年,IBM 和 Intersolv 做出了重要貢獻)、ODBC 3.5(1997 年)和 ODBC 3.8(約 2009 年),後者與Windows 77)整合。
同時,微軟試圖超越 ODBC,開發了其他資料存取模型:OLE DB、ADO、DAO、RDS、Jet 引擎,以及後來的 ADO.NET。最初的計劃是讓 OLE DB 和 ADO 等技術取代 ODBC,成為主要的資料存取標準,尤其是在物件導向的場景以及資料來源不一定是 SQL 的情況下。
然而,市場實際情況卻並非如此:ODBC 仍然是存取 SQL 資料來源的事實標準。 Oracle 和 IBM 等廠商的大力支援、其跨平台特性以及種類繁多的現有應用,確保了它仍然是許多專案的首選。
如今,當我們談到存取 SQL 資料庫時,仍然完全有效的兩大標準是ODBC 和 JDBC。其他模型,例如 OLE DB 或某些 ADO 層,已經失去了很大一部分意義,在許多情況下已被棄用,或者僅僅為了兼容舊版應用程式而保留下來。
ODBC架構:其內部運作原理
要充分理解 ODBC 的用途,了解其架構很有幫助。 ODBC在應用程式和資料庫管理系統 (DBMS) 之間引入了一個中間層,使得應用程式不必直接與資料庫通信,而是透過標準 API 進行通訊。
一般來說,流程如下:應用程式向 ODBC 驅動程式管理器發送 SQL 請求,ODBC 驅動程式管理器查找並載入目標資料庫的相應驅動程序,驅動程式將請求轉換為 DBMS 的本機協議,資料庫處理查詢,並將結果沿原路返回給應用程式。
這種架構不僅實現了廠商獨立性,還解決了版本相容性、錯誤處理、資料類型轉換以及不同引擎之間的 SQL 語法差異等問題。一切都盡可能地對應用程式開發人員透明。
在 Windows 系統中,ODBC 是Windows 開放服務架構 (WOSA)的一部分,WOSA 是開放服務架構,桌面應用程式無需為每個平台重新編寫程式碼即可連接到不同的運算環境。
ODBC的主要組成部分
ODBC 在 Microsoft 系統和許多平台上的典型實作遵循一種通用結構。我們可以區分出幾個關鍵組件,它們協同工作以實現這種開放式連接。
一方面,ODBC API是一組呼叫函數、錯誤代碼和標準 SQL 約定,應用程式使用它來處理資料。此 API 定義瞭如何開啟連線、傳送查詢、檢索結果以及管理事務,而無需依賴特定的資料庫管理系統 (DBMS)。
另一個關鍵要素是ODBC 驅動程式管理員(在 Windows 系統中為 Odbc32.dll 函式庫)。這個動態連結庫位於應用程式和特定驅動程式之間,以透明的方式加載,負責查找、加載和下載相應的驅動程序,以及管理版本和相容性。
接下來是ODBC資料庫驅動程式。每個資料庫管理系統(例如SQL Server、Oracle、MySQL、DB2等)都有自己的驅動程序,通常以一個或多個DLL檔案的形式存在。這些驅動程式負責將ODBC API調用轉換為原生資料庫管理系統調用,並處理特定的SQL語法、內部資料類型以及各個資料庫引擎的特性。
在某些環境中,也會使用ODBC 遊標庫(例如 Windows 上的 Odbccr32.dll),該程式庫位於驅動程式管理員和驅動程式本身之間,用於處理捲動瀏覽結果集、進階遊標和其他資料導覽操作。
最後,我們還有ODBC 資料來源管理器,這是一個圖形化配置工具,可用來定義和修改系統的資料來源 (DSN)。您可以在這裡決定使用哪個驅動程式、連接到哪個伺服器或文件,以及使用哪些身份驗證參數。
支援 ODBC 的應用程式和資料來源類型
任何能夠使用標準 API 建立連接的軟體都可以被視為支援 ODBC 的應用程式。在實際應用中,這涵蓋了從辦公室套件到分析工具和客製化企業應用程式等各種軟體。
典型的例子包括Microsoft Excel、Microsoft Access、Power BI、Tableau、Crystal Reports、Qlik Sense以及眾多需要向不同系統讀取或寫入資料的管理應用程式(ERP、CRM、垂直解決方案等)。
為了使應用程式能夠存取數據,需要使用 ODBC 資料來源。這些資料來源將資料來源與必要的連線資訊結合,包括伺服器位置、資料庫名稱、使用者名稱、密碼以及驅動程式特定的選項。此配置通常封裝在資料來源名稱 (DSN) 或連接字串中。
在 Windows 系統中,ODBC 資料來源透過ODBC 資料來源管理器進行管理。您可以在其中配置不同類型的 DSN,每種 DSN 都有自己的作用域和儲存模式,從而在將應用程式部署到單一電腦或共用伺服器時提供相當大的靈活性。
一個重要的細節是,資料存取類別和庫可以與任何具有可用 ODBC 驅動程式的資料來源配合使用。這包括關聯式資料庫、ISAM 引擎、Excel 電子表格、文字文件,甚至是以表格格式公開資料並透過 SQL 存取的即時資料來源。
ODBC 中的 DSN 類型和連接字串
在討論 ODBC 配置時,幾乎總是會提到 DSN (資料來源名稱)的概念。 DSN 包含了建立連線所需的所有資料:使用的驅動程式、指向的伺服器、特定的資料庫、憑證以及其他選項。
在 Windows 系統中,DSN 分為三種類型。使用者 DSN將設定資訊儲存在註冊表中,且僅供目前使用者設定檔使用,因此只有該帳戶才能使用。當您需要按使用者隔離連線並防止其他使用者查看配置時,使用者 DSN 非常有用。
系統 DSN也儲存在登錄中,但對電腦的所有使用者(包括系統服務)可見。對於伺服器或共用安裝,建議使用系統 DSN,因為它們允許不同的帳戶使用相同的連接設置,而不會造成重複。
另一方面,還有基於檔案的DSN,它將連接資訊儲存在擴展名為.dsn的文字檔案中,而不是註冊表中。這些DSN通常更靈活,因為它們可以複製到安裝了相同驅動程式的其他計算機,或放置在共用伺服器上以集中配置。
除了可共享的 DSN 之外,還有不可共享的檔案 DSN,它們駐留在單一機器上,並充當指向機器 DSN 的指標。這使您能夠利用現有資料來源,而無需公開整個配置。
在許多程式語言(例如 Visual Basic 或 C#)中,您也可以選擇不定義 DSN,而是將直接連接字串傳遞給 ODBC 驅動程式管理員。該字串包含與 DSN 相同的參數,但嵌入在程式碼中,從而簡化了應用程式分發,但代價是犧牲了一些管理靈活性。
Windows 系統中的實用 ODBC 配置
在 Windows 系統上使用 ODBC 的典型入門流程遵循幾個清晰的步驟。首先,您需要為目標資料庫管理系統 (DBMS) 安裝對應的 ODBC 驅動程式。有時,Windows 系統會自備該驅動程式(例如,SQL Server 或 Access 的通用驅動程式),有時,則由資料庫供應商或專業的第三方提供。
驅動程式安裝完成後,從「控制台」→「管理工具」開啟「資料來源 (ODBC)」工具。此實用程式將開啟 ODBC 資料來源管理器,您可以在其中根據安全性和共用需求選擇建立使用者、系統或檔案 DSN。
下一步是點擊“新增”,選擇相應的驅動程式(例如,“SQL Server”、“Microsoft Access Driver (*.mdb, *.accdb)”等),然後按照精靈操作:通常會要求您輸入來源的描述性名稱、它指向的伺服器或文件,以及在許多情況下輸入憑證或驗證模式。
在 64 位元環境下,必須注意系統架構:64 位元 Windows 安裝包含兩個版本的 ODBC 管理器 (Odbcad32.exe):64 位元版本位於 %systemdrive%\Windows\System32,32 位元版本位於 %systemdrive%\Windows\SysWOW64。32 位元驅動程式也只會出現版本位於 %systemdrive%\Windows\SysWOW64。32 位元驅動程式管理器也是如此。
Access、Qlik Sense 和 Tableau 等應用程式可以連接到外部資料庫。有些應用程式還提供自己的連接器,其中封裝了授權的 ODBC 驅動程式(例如,Qlik 的 ODBC 連接器套件),因此使用者甚至無需通過 Windows 資料來源管理器。
將 ODBC 與 Access、Qlik Sense 或 Tableau 等工具搭配使用
在 Microsoft Access 中,ODBC 用於連線或匯入Access 沒有內建驅動程式的外部資料來源(例如 SQL Server、Oracle 或第三方資料庫)中的資料。具體流程如下:Access 連線至 ODBC 驅動程式管理器,該管理員使用特定的驅動程式(例如 SQL Server 驅動程式),然後開啟與資料庫的連線。
使用 Qlik Sense,我們有兩種選擇。一方面,我們可以使用 Qlik ODBC 連接器包中包含的連接器,這些連接器提供最佳化的「Qlik-xxx」驅動程序,可以直接在 Qlik 介面中進行配置,而無需透過 Windows ODBC 管理器。另一方面,我們也可以手動為資料庫管理系統 (DBMS) 安裝 ODBC 驅動程序,並建立使用者或系統資料序號 (DSN),供 Qlik Sense 在建立資料連線時使用。
在 Qlik Sense Desktop 中,DSN 清單可以顯示在 Windows 系統中建立的 DSN 以及軟體包的內部驅動程式(以「Qlik-」為前綴)。這些內部驅動程式不能用於在 Qlik 生態系統之外建立通用的 ODBC 連線;它們僅供產品自帶的資料庫連接器使用。
以 Tableau 為例,它提供了一系列針對特定資料庫(例如 Snowflake、SQL Server、Oracle 等)精心優化的原生連接器,但同時也提供了一個通用的 ODBC 連接器,用於存取沒有特定連接器的資料庫。此連接器利用 ODBC 標準,幾乎可以與任何實作了 SQL 和 ODBC API 的資料來源進行通訊。
透過 ODBC 連線時,Tableau 會執行一個發現階段,在此階段,它會查詢 ODBC 驅動程式以確定其支援的功能:標量和聚合函數、日期處理、子查詢功能、可用的 JOIN 類型、建立臨時表等。根據驅動程式的回應,Tableau 會將連線分類為完全可用、有輕微限制、有重大限製或完全不可用。
ODBC 和 JDBC 之間的關係

在資料存取生態系統中,ODBC 在 Java 世界中有著天然的對應物:JDBC(Java 資料庫連線)。兩者都追求相同的目標:為應用程式提供一個使用 SQL 連接到不同資料庫的標準,但採用的方法會根據各自的環境進行調整。
雖然 ODBC 主要面向用 C、C++ 或其他支援其 API 的語言編寫的應用程序,並且在 Windows 上廣泛使用(儘管也在其他平台上使用),但 JDBC 本身就是 Java 生態系統的一部分,並且從定義上來說就是跨平台的,可以在虛擬機上運行。
JDBC架構分為API層和驅動層。 API層包含開發人員使用的Java介面和類別,而驅動層則實作這些介面並與實際資料庫通訊。 JDBC驅動程式有四種:類型1(ODBC橋接器)、類型2(原生/部分API)、類型3(網路協定)和類型4(100% Java「瘦」驅動程式)。
舊版的JDBC-ODBC 橋接驅動程式(類型 1)允許 Java 應用程式透過 ODBC 存取資料庫。它曾經作為一種過渡方案發揮作用,但隨著時間的推移,由於效能和複雜性問題,其受歡迎程度有所下降,並已從現代 Java 版本中消失。
在 JDBC 中,資料庫連線是透過格式為jdbc::/// 的URL加上可選屬性建立的。例如:jdbc:mysql://localhost:3306/mydatabase。 Java DriverManager 會根據此 URL 找到合適的驅動程式並開啟連接,這與 ODBC 環境中 ODBC Manager 選擇驅動程式的方式類似。
從實際應用角度來看,ODBC 和 JDBC 的主要差異在於它們所面向的語言和生態系統。 ODBC 與 Windows 和原生應用程式深度集成,而 JDBC 則與 Java 世界無縫集成,支援 Java 特有的資料類型,並提供諸如 ResultSet 之類的工具來處理結果。在某些情況下,Type 4 JDBC 驅動程式可以透過消除中間層來提供極具競爭力的效能。
最終,選擇哪種方式取決於應用程式的技術:Java 應用程式通常使用 JDBC;原生應用程式則使用 ODBC。無論如何,兩者都代表著相同的理念,即標準化的、與供應商無關的存取方式。
ODBC 仍然是資料存取領域的關鍵組成部分:它允許各種程式透過通用 API 連接到截然不同的資料庫,借助其驅動程式隱藏了不同引擎之間的差異,相容於 Access、Qlik Sense 和 Tableau 等各種工具,並且與 Java 世界中的 JDBC 等其他標準共存。因此,如果您了解 ODBC 的工作原理,就相當於掌握了在幾乎所有現代資料庫環境中順暢操作的秘訣。
對字節世界和一般技術充滿熱情的作家。我喜歡透過寫作分享我的知識,這就是我在這個部落格中要做的,向您展示有關小工具、軟體、硬體、技術趨勢等的所有最有趣的事情。我的目標是幫助您以簡單有趣的方式暢遊數位世界。


