開放資料庫互連

為解決異構資料庫間的數據共享而產生的技術

開放資料庫連接(Open Database Connectivity,ODBC)是為解決異構資料庫間的數據共享而產生的,現已成為WOSA(The Windows Open System Architecture ),Windows開放系統體系結構)的主要部分和基於Windows環境的一種資料庫訪問介面標準ODBC 為異構資料庫訪問提供統一介面,允許應用程序以SQL 為數據存取標準,存取不同DBMS管理的數據;使應用程序直接操縱DB中的數據,免除隨DB的改變而改變。用ODBC 可以訪問各類計算機上的DB文件,甚至訪問如Excel 表和ASCI I數據文件這類非資料庫對象。

軟體架構


應用程序

應用程序對外提供使用者交談界面,同時對內執行資料之準備工作資料庫系統所傳回來的結果在顯示給使用者看。簡單來說,應用程序即ODBC 界面執行下列主要工作:
Request a connection(i.e.session) with a data source.
Send SQL requests to the data source.
Define storage areas and data formats for the result of SQL requests.
Request results.
Process errors.
Request a commit or rollback of operations for transcation control.
Terminate a connection a data source.
1.Request a connection(i.e.session) with a data source.
2.Send SQL requests to the data source.
3.Define storage areas and data formats for the result of SQL requests.
4.Request results.
5.Process errors.
6.Request a commit or rollback of operations for transcation control.
7.Terminate a connection a data source.

驅動管理器

驅動管理器本身是MS Windows中一個動態連接鏈接庫文件(ODBC.DLL)。應用程序透過驅動管理器去載入並連接數據源的驅動程序(driver)並連接數據源。驅動管理器主要工作如下:
1. Uses ODBC INI file to map a data source name to a specific driver DLL.
2. Processes server ODBC initialization calls.
3. Provides entry points to ODBC functions for each driver.
4. Provides parameter validation and sequence validation for ODBC calls.

驅動程序

驅動程序也是一個動態連接鏈接庫文件,當應用程序呼叫ODBC函數,SQLConnect 或SQLDriverConnect時,驅動管理器就會載入相對的驅動程序與應用程序呼應。驅動程序主要是執行ODBC之相對函數,並與對應的數據源(Data Source)做溝通。驅動程序之工作如下:
1. Establishes a connect to a data source.
2. Submits requests to a data sources.
3. Translates data to or from other formats,if requested by the application.
4. Return results to the application.
5. Formats errors into standard error codes and returns them to the application.
6. Declares and manipulates cursors if necessary (invisible to the application).
7. Initiates transactions if the data source requires explicit transaction initiation(invisible to the app).

數據源

數據源唯一資料庫系統(DBMS)或是資料庫操作系統的一個組合。舉例來說,應用庫系統可以同時與下列兩個或其中一個數據源連接。
1. A DBMaker DBMS running on a Microsoft Windows NT accessed by NTaccessed by TCP/IP.
2. A Tandem NonStop SQL DBMS running on the Guardian 90 accessed via a gateway.
應用系統程序通過標準API來連接數據源,因此開發過程中不需指定特定的資料庫系統,所以資料庫系統的開放性從此被建立。筆者認為在計算機系統進入開放時代之時,我們應可體會到標準的建立與系統的發展是同樣的重要。而信息系統架構在資料庫的必要性也隨著信息化社會的蓬勃發展而更顯重要,因此在ODBC標準日益成熟的同時,我們也同時可以感受到資料庫系統在開放架構下,更需扮演強而有力的角色。
依據 ODBC 的規格,其API共可分為以下九類:
1. SQLAllocEnv.
2. SQLAllocConnect.
3. SQLConnect.
4. SQLPriverConnect.
5. SQLBrowseConnect.
1. SQLDataSource.
2. SQLGetInfo.
3. SQLGetFunctions.
4. SQLGetTypeInfo.
1. SQLSetConnectOption.
IV. 準備SQL指令之需求
1. SQLAllocStmt. 2. SQLPrepare. 3. SQLSetParam. 4. SQLParamOptions. 5. SQLGetCursorName. 6.SQLSetCursorName. 7. SQLSetScrollOptions.
1. SQLExecute. 2. SQLExecDirect. 3. SQLNativeSql. 4. SQLDescribeParanl. 5. SQLNumParams. 6.SQLParamData. 7. SQLPutData.
VI. 取得執行結果及有關結果的訊息
1. SQLRowCount. 2. SQLNumResultCols. 3. SQLDescribeCol. 4. SQLColAttributes. 5. SQLBindCol. 6.SQLFetch. 7. SQLExtendedFetch. 8. SQLGetData. 9. SQLSetDos. 10. SQLMoreResults. 11. SQLError.
VII. 取得有關數據源系統回錄(System tables or Catalog)的訊息
ODBC程序流程
ODBC程序流程
1. SQLColumnPrivileges. 2. SQLColumns. 3. SQLForeignkeys. 4. SQLPrimaryKeys. 5.SQLProcedureColumns. 6. SQ LProcedures. 7. SQLSpecialColumns. 8. SQLStatistics. 9. SQLTablePrivileges. 10. SQLTables.
VIII. 結束 SQL 指令需求
1. SQLFreeStmt. 2. SQLCancel. 3. SQLTransact.
IX. 結束與數據源的連接
1. SQLDisconnect. 2. SQLFreeConnect. 3. SQLFreeEnv.
以上所列之 ODBC API函數,我們發現全都以 SQL 為開頭。除以上述分類外,各個函數在其必要性或複雜度上,更被規定在不同的幾個層級中 ODBC 函數的層級為核心層(Core level),第一層(Level 1),和第二層(Level 2)。我們再來看一個很基本的應用程序步驟是如何呢?下圖告訴我們這個答案。
回顧 ODBC 的架構及其執行過程,ODBC 造就了"應用程序獨立性(Application Independency)"的特性,使應用程序不需在乎數據源是何種資料庫系統或者純粹是個資料或文本文件,只要相對驅動程序能完成銜接的功能,則應用程序即可達到高度的獨立性。

系統更新


ODBC現在看來是一個比較古老的東西,在1996年左右就比較定型了,其最新的版本是 3.8(Win7 自帶;Win8 上有更新但仍叫 3.8),MICROSOFT也不打算對它做什麼大的更新,更多的目光應該被放到OLEDB、.NET DATA PROVIDER身上了。然而,正因為它是一個比較成熟和古老的規範,ODBC在大多數DBMS上都可以使用,可以說一個像樣的DBMS都應該支持ODBC 3.0或以上的版本。
如果你打算學習如何開發一個ODBC DRIVER,最好的參考資料還是MSDN。如果你不打算採用ODBC API做開發,學習和了解ODBC也可以增加對DBMS的了解,也能更好地理解其他的資料庫訪問介面和技術。
一個基於ODBC的應用程序對資料庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的資料庫操作由對應的DBMS的ODBC驅動程序完成。也就是說,不論是FoxPro、Access還是Oracle資料庫,均可用ODBCAPI進行訪問。由此可見,ODBC的最大優點是能以統一的方式處理所有的資料庫。
開放資料庫互連(ODBC)是Microsoft引進的一種早期資料庫介面技術。它實際上是我們要在本章後面加以討論的ADO的前身。Microsoft引進這種技術的一個主要原因是,以非語言專用的方式,提供給程序員一種訪問資料庫內容的簡單方法。換句話說,訪問DBF文件或Access Basic以得到MDB文件中的數據時,無需懂得Xbase程序設計語言。事實上,Visual C++就是這樣一個程序設計平台,即Microsoft最初是以ODBC為目標的。
你會發現,ODBC工作起來和Windows一樣,它用包含在DLL內的驅動程序完成任務。其實,ODBC提供一套兩個驅動程序:一個是資料庫管理器的語言,另一個為程序設計語言提供公用介面。允許Visual C++用標準的函數調用經公用介面訪問資料庫的內容,是這兩個驅動程序的匯合點。當然,還有其它和ODBC有關的實用程序類型的DLL。例如,一個這樣的DLL允許你管理ODBC數據源。ODBC的實際管理介面出現在SYSTEM文件夾中的某個CPL(控制面板)文件中尋找我們在後面要談到這方面的問題。ODBC的確能履行承諾,提供對資料庫內容的訪問,並且沒有太多的問題。它沒有提供資料庫管理器和C之間儘可能最好的數據轉換,這種情況是有的,但它多半能像廣告所說的那樣去工作。唯一影響ODBC前程的是,它的速度極低至少較早版本的產品是這樣。ODBC最初面世時,一些開發者曾說,因為速度問題,ODBC永遠也不會在資料庫領域產生太大的影響。然而,以Microsoft的市場影響力,ODBC毫無疑問是成功了。今天,只要有兩種ODBC驅動程序的一種,那麼幾乎每一個資料庫管理器的表現都會很卓越。

使用方式


ODBC
ODBC
在可以用ODBC做任何事之前,必須有一個資料庫模型在腦子裡。在一 個像Access這樣的應用程序中創建資料庫框架通常會更容易一些,因為Access可以非常輕鬆地提供完成任務所需的各種功能。但是,如果你安裝了所需的ODBC驅動程序,那就可以在C++中創建程序框架。一設計了資料庫,就要為其創建ODBC數據源,我們會在本節中看到這一點。下面的過程並沒有嚴格地說明活動的經過,只是說明了一種配置數據源的技術。
註釋 我會在第5章中說明如何創建一個Access資料庫。現在,我們只是看一看,為了訪問那個資料庫,我們下一步要做些什麼。
ODBC
ODBC
2. 單擊Add按鈕。會看到Create New Data Source(創建新的數據源)對話框,如下圖所示。技巧 檢查ODBC Data Source Administrator(ODBC數據源管理員)對話框的About選項卡,可以確定你正在使用的ODBC驅動程序的最新版本。這個選項卡包含了各種ODBC DLL的版本號、生產廠商的名稱以及出現在SYSTEM文件夾中的文件名。大多數情況下,通過查看版本號可以驗證ODBC驅動程序是否是最新的版本。
ODBC
ODBC
3. 選擇一個數據源。對本練習來說,我選擇了Access數據源。單擊Finish(完成),會看到某種類型的配置對話框,如下面的ODBC Microsoft Access 97Setup(設置)對話框所示。註釋 如果你選擇的數據源和我在本實例中選擇的不同,那麼所需的配置步驟也和這裡說明的不同棗每個ODBC驅動程序都要求不同類型的配置。
4. 在Data Source Name(數據源名)域內輸入數據源名稱。一定要選擇意義明確但又不過於冗長的名稱。我選擇Food Database(食品資料庫),因為我最終要創建一個與食品庫存有關的資料庫的鏈接。
5. 在Description(描述)域內輸入一段說明性文字。可以讓這個項比上一個項稍長一些,因為它描述資料庫的用途。另一方面,也不要寫入像《戰爭與和平》那樣大的小說。對本練習,我輸入了:This database contains inventoryinformation for a food store(本資料庫包含食品存儲的庫存信息)。
ODBC
ODBC
6. 單擊Select(選擇)按鈕。你會看到一個File Open-type(文件 打開類型)對話框,可以在那裡選擇一個現有的資料庫。ODBC驅動程序會自動選擇正確的文件擴展名。
技巧 並不是一定要提前設計資料庫。請注意,Access ODBC驅動程序還包括一個創建新資料庫的按鈕。很多ODBC驅動程序都提供了這種功能,但並不是全都這樣。單擊這個按鈕會啟動資料庫管理器應用程序,並允許你設計資料庫。注意有一點很有意思,Access ODBC驅動程序還會允許你使用這個對話框壓縮或修補資料庫。
7. 選擇系統資料庫選項。在大多數情況下要選擇None(無),除非你為應用程序特別創建了一個系統資料庫。如果確實添加了系統資料庫,它會出現在ODBC Microsoft Access 97 Setup(設置)對話框的System DSN(系統DSN)選項卡上。
ODBC
ODBC
8. 單擊Advanced(高級)按 鈕,會看到Set Advanced Options(設置高級選項)對話框,如下圖所示。無需對很多項做修改。但是,要把客戶名添加到LoginName(註冊名)域中,把客戶口令添加到Password(口令)域中。這允許客戶在訪問你的資料庫時,根本不用了解訪問的細節——甚至不用了解被記錄的客戶名。技巧 為最優化潛在的區域,可以瀏覽一下ODBC驅動程序提供的一系列高級選項。例如,Access ODBC允許你更改DBMS所用的線程數量。預設設置3通常提供了不錯的性能,但是你會發現,複雜程序中線程多一些的話,可以提高前台任務的速度。由於Windows使用了一些處理器循環對線程實施管理,所以使用了過多的線程又會降低應用程序的速度。
9. 設置完所需的高級選項后單擊OK。
10. 再次單擊OK關閉ODBC Microsoft Access 97 Setup(設置)對話框。應該看到,新的設置項已經添加到ODBC Data Source Administrator(ODBC數據源管理員)對話框中。如果今後要為資料庫更改這些設置,只要簡單地加亮它並單擊Configure(配置)。刪除資料庫配置也很容易,只要加亮DSN並單擊Remove(刪除)即可。創建系統DSN和製作用戶DSN差不多。兩者間一個顯著的差別是,使用它們的目的不同。系統DSN告訴應用程序如何與資料庫相連,在一些情況下如何與之交互作用。系統DSN不包含資料庫所需的任何數據——它包含連接標準,其中可以包括從用戶列表到重要文件位置的一切信息。

程序種類


管理方法
ODBC 分為單束式和多束式兩類
ODBC 使用層次的方法來管理資料庫,在資料庫通信結構的每一層,對可能出現依賴資料庫產品自身特性的地方,ODBC 都引入一個公共介面以解決潛在的不一致性,從而很好地解決了基於資料庫系統應用程序的相對獨立性,這也是ODBC 一經推出就獲得巨大成功的重要原因之一。
從結構上分,ODBC 分為單束式和多束式兩類。
單束式驅動程序
單束式驅動程序介於應用程序和資料庫之間,像中介驅動程序一樣數據提供一個統一的數據訪問方式。當用戶進行資料庫操作時,應用程序傳遞一個ODBC 函數調用給ODBC 驅動程序管理器,由ODBC API 判斷該調用是由它直接處理並將結果返回還是送交驅動程序執行並將結果返回。由上可見,單束式驅動程序本身是一個資料庫引擎,由它直接可完成對資料庫的操作,儘管該資料庫可能位於網路的任何地方。
多束式驅動程序
多束式驅動程序負責在資料庫引擎和客戶應用程序之間傳送命令和數據,它本身並不執行數據處理操作而用於遠程操作的網路通信協議的一個界面。
前端應用程序提出對資料庫處理的請求,該請求轉給ODBC 驅動程序管理器,驅動程序管理器依據請求的情況,就地完成或傳給多束驅動程序,多束式驅動程序將請求翻譯為特定廠家的資料庫通信介面(如Oracle 的SQLNet)所能理解的形式並交於介面去處理,介面把請求經網路傳送給伺服器上的數據引擎,伺服器處理完后把結果發回給資料庫通信介面,資料庫介面將結果傳給多束式ODBC 驅動程序,再由驅動程序將結果傳給應用程序。

文件DSN


ODBC
ODBC
你可能已經注 意到了,上一節中的實例有問題。如果想單獨配置網路上的每一台機器,它會工作得很好,但這可能不是一個好主意。還有一種存儲創建數據源所需信息的方式:文件DSN。這正是我們要在本節中討論的。下面的過程說明了設置文件DSN的一般方法。
ODBC
ODBC
1. 雙擊Control Panel(控制面板)中的32位ODBC小程序,會看到ODBCData Source Administrator(ODBC數據源管理員)對話框。選擇File DSN(文件DSN)選項卡,會看到如下圖所示的對話框。要做的第一件事是,選擇存儲DSN信息的地方。2. 單擊Look In(觀察)下拉列表框,會看到一系列當前機器的目錄和驅動器。可以為DSN使用任何存儲位 置。我通常在網路上選擇資料庫存儲目錄。使用UNC(通用命名標準)意味著,每個人都會用相同的路徑來訪問DSN文件。
技巧 Up One Level(上一和在Explorer中是一樣的。可以用該按鈕返回到上一級目錄。最後,你會在My Computer(我的電腦)處結束,看到機器上所有驅動器的清單。
ODBC
ODBC
3. 單擊Add(添加),會看到Create New Data Source(創建新的數據源)對話框。
ODBC
ODBC
4. 在列表中選擇一個ODBC驅動程序,然後單擊Next(下一個)。對本示例來說,我再次選擇Access。你會看到Create New Data Source(創建新的數據源)對話框的下一頁顯示出來。在這裡選擇數據源的名稱和存儲位置。單擊Browse(瀏覽)會看到File Open-type(文件打開類型)對話框,在這裡選擇存儲位置。輸入一個文件名,ODBC嚮導自動添加DSN作為擴展名。在本示例中,我選擇SAMPLE.DSN作為DSN文件的名稱。5. 單擊Next(下一個)會看到一個摘要對話框,如下圖所示。它說明正準備創建的DSN的參數。6. 單擊Finish(完成)。這時,會看到ODBC Microsoft Access 97 Setup(設置)對話框的修改版。不能像我們在上一節所做的那樣,在Data Source Name(數據源名)或Description(描述)欄位中添加信息了,不過,其它的都和以前一樣。7. 一定要單擊Select(選擇)按鈕輸入資料庫的名稱,然後選擇想要使用的資料庫(如果想創建一個新資料庫,也可以單擊Create(創建))。
ODBC
ODBC
8. 完成配置過程時單擊OK,你會在 ODBC Data Source Administrator(ODBC數據源管理員)對話框中看到一個新的DSN文件項。和我們創建的前一個DSN不同,這個DSN實際上創建可以用文本編輯器來查看和編輯的文件。圖4.1顯示了我的文件的外觀。請注意,它符合標準的INI文件格式。你可以在頂端看到【ODBC】標題。下面是我選擇的全部設置。這個文件允許我從Visual C++選擇數據源,而機器間的傳輸也是非常容易的。我甚至能在安裝過程中按要求更改位置——在你不知道用戶會有什麼樣的設置時,這一點確實很不錯。

記錄事務


ODBC
ODBC
調試應用 程序時加以記錄,這一點很重要。ODBC Data Source Administrator(ODBC數據源管理員)對話框也提供了這樣的功能。可以選擇跟蹤你通過ODBC對資料庫進行的各種事務。當然,這些記錄可能會變得相當大,但我們並不是總要使用它們。
開始記錄事務時,只要雙擊控制面板(Control Panel)中的32位ODBC小程序,打開ODBC Data Source Administrator(ODBC數據源管理員)對話框。選擇Tracing(跟蹤)選項卡,你會看到如下圖所示的對話框(請注意,該對話框的Windows 98版本略有不同)。如你所見,有三個單選按鈕確定何時跟蹤ODBC調用。預設設置是Don'tTrace(不跟蹤)。如果打算調試單個應用程序,應該選擇All the Time(全部時間)。One-Time Only(只一次)在下一次連接期間跟蹤ODBC調用棗只要連接一拆除,跟蹤就關閉。當用戶帶著特定的問題調用時,這是一個不錯的選擇。可以監視一次會話期間的連接,然後用該信息幫助創建排除錯誤的計劃。
跟蹤不會自動開始。還要單擊對話框右側的Start Tracing Now(現在開始跟蹤)。只要跟蹤一開始,按鈕標題就變成Stop Tracing Now(現在停止跟蹤)。再次單擊按鈕關閉跟蹤過程。
唯一要擔心的其它設置是Log File Path(記錄文件路徑)。ODBC通常在根目錄下的SQL.LOG文件中放入事務信息。但是,也可以將該信息放在網路驅動器上,或者用戶看不到的地方。在調試過程中,預設位置通常就比較適宜。
註釋 除非你想創建自己的日誌記錄DLL,否則不要更改Custom Trace DLL(自定義跟蹤DLL)域內的設置。在這裡列出的DLL表,ODBCTRAC.DLL負責維持事務記錄。