開放資料庫互連
為解決異構資料庫間的數據共享而產生的技術
開放資料庫連接(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程序流程
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
註釋 我會在第5章中說明如何創建一個Access資料庫。現在,我們只是看一看,為了訪問那個資料庫,我們下一步要做些什麼。
ODBC
ODBC
4. 在Data Source Name(數據源名)域內輸入數據源名稱。一定要選擇意義明確但又不過於冗長的名稱。我選擇Food Database(食品資料庫),因為我最終要創建一個與食品庫存有關的資料庫的鏈接。
5. 在Description(描述)域內輸入一段說明性文字。可以讓這個項比上一個項稍長一些,因為它描述資料庫的用途。另一方面,也不要寫入像《戰爭與和平》那樣大的小說。對本練習,我輸入了:This database contains inventoryinformation for a food store(本資料庫包含食品存儲的庫存信息)。
ODBC
技巧 並不是一定要提前設計資料庫。請注意,Access ODBC驅動程序還包括一個創建新資料庫的按鈕。很多ODBC驅動程序都提供了這種功能,但並不是全都這樣。單擊這個按鈕會啟動資料庫管理器應用程序,並允許你設計資料庫。注意有一點很有意思,Access ODBC驅動程序還會允許你使用這個對話框壓縮或修補資料庫。
7. 選擇系統資料庫選項。在大多數情況下要選擇None(無),除非你為應用程序特別創建了一個系統資料庫。如果確實添加了系統資料庫,它會出現在ODBC Microsoft Access 97 Setup(設置)對話框的System DSN(系統DSN)選項卡上。
ODBC
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 驅動程序,再由驅動程序將結果傳給應用程序。
ODBC
ODBC
技巧 Up One Level(上一和在Explorer中是一樣的。可以用該按鈕返回到上一級目錄。最後,你會在My Computer(我的電腦)處結束,看到機器上所有驅動器的清單。
ODBC
ODBC
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負責維持事務記錄。