中科永聯高級技術培訓中心(www.itisedu.com)
ODBC(OpenDatabaseConnectivity,開放資料庫互連)是微軟公司開放服務結構(WOSA,WindowsOpenServicesArchitecture)中有關資料庫的一個組成部分,它建立了一組規範,並提供了一組對資料庫訪問的標準API(套用程式編程接口)。這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。
ODBC是Open Database Connectivity的縮寫,是MICROSOFT提出的資料庫訪問接口標準。ODBC定義了訪問資料庫的API一個規範,這些API獨立於不同廠商的DBMS,也獨立於具體的程式語言(但是MICROSOFT的ODBC文檔是用C語言描述的,許多實際的ODBC驅動程式也是用C語言寫就的。)ODBC規範後來被X/OPEN和ISO/IEC採納,作為SQL標準的一部分,具體內容可以參看《ISO/IEC 9075-3:1995 (E) Call-Level Interface (SQL/CLI)》等相關的標準檔案。
ODBC現在看來是一個比較古老的東西,在1996年左右就比較定型了,其最新的版本是3.52,MICROSOFT也不打算對它做什麼大的更新,更多的目光應該被放到OLEDB、.NET DATA PROVIDER身上了。然而,正因為它是一個比較成熟和古老的規範,ODBC在大多數DBMS上都做可以使用,可以說一個像樣的DBMS都應該支持ODBC 3.0或以上的版本。
如果你打算學習基於ODBC API的套用開發,最好的參考資料是MSDN。如果你打算學習如何開發一個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驅動程式的一種,那么幾乎每一個資料庫管理器的表現都會很卓越。
一、OBDC 的架構
I.應用程式(Application)
應用程式對外提供使用者交談界面,同時對外提供使用者交談界面,同時對內執行資料之準備工 href=/wiki/%E8%B3%87%E6%96%99%E5%BA%AB%E7%B3%BB%E7%B5%B1 target="_new">資料庫系統所傳回來的結果在顯示給使用者看。簡單來說,應用程式藉 ODBC 界面執行下列主要工作:
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.
II.驅動管理員(Driver Manager )
驅動管理員本身在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 initalization calls.
3.Provides entry points to ODBC functions for each driver.
4.Provides parameter validation and sequence validation for ODBC calls.
III.驅動程式(Driver)
驅動程式也是一個動態連線程式庫檔案,當應用程式呼叫 ODBC 函式,SQLConnect 或 SQLDriverConnect時,驅動管理員就會載入相對的驅動程式與應用程式呼應。驅動程式主要是執行 ODBC 之相對函式,並與對應之資料來源(Data Source)做溝通。驅動程式之工作如下:
1.Establishes a connect to a data source.
2.Submits requests to a data sources.
3.Trnslates 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).
IV.資料來源(Data Source)
資料來源唯一資料庫系統(DMBS)或是資料庫作業系統的一個組合。舉例來說,套用庫系統可以同時與下列兩個或其中一個資料來源連線。
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.
套用系統程式透過標準資料來ODBC界面與源連線,因此開發過程中不需指定特定的資料庫系統,所以資料庫系統的開放性從此被建立。筆者認為在計算機系統進入開放時代之時,我們應可體會到標準的建立與系統的發展是同樣的重要。而信息系統架構在資料庫的必要性也隨著信息化社會的蓬勃發展而更形重要, 因此在ODBC標準日益成熟的同時,我們也同時可以感受到資料庫系統在開放架構下,更須扮演強而有力的角色。
依據 ODBC 的規格,其界面共可分為以下九類界面函式:
I.連線資料來源(Connecting to a Data Source)
1.SQLAllocEnv.
2.SQLAllocConnect.
3.SQLConnect.
4.SQLPriverConnect.
5.SQLBrowseConnect.
II.取得驅動程式及資料來源的相關訊息
1.SQLDataSource.
2.SQLGetInfo.
3.SQLGetFunctions.
4.SQLGetTypeInfo.
III.設定及取得驅動程式的選項
1.SQLSetConnectOption.
2.SQLGetConnectOption.
3.SQLSetStmtOption.
4.SQLGetStmtOption.
IV.準備SOL指令之需求
1.SQLAllocStmt.
2.SQLPrepare.
3.SQLSetParam.
4.SQLParamOptions.
5.SQLGetCursorName.
6.SQLSetCursorName.
7.SQLSetScrollOptions.
V.傳送及執行需求
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)的訊息
1.SQLColumnPrivileges.
2.SQLColumns.
3.SQLForeignkeys.
4.SQLPrimaryKeys.
5.SQLProcedureColumns.
6.SQLProcedures.
7.SQLSpecialColumns.
8.SQLStatistics.
9.SQLTablePrivileges.
10.SQLTables.
VIII.結束 SQL 指令需求
1.SQLFreeStmt.
2.SQLCancel.
3.SQLTransact.
IX.結束與資料來源的連線
1.SQLDisconnect.
2.SQLFreeConnect.
3.SQLFreeEnv.
以上所列之 ODBC 界面函式,我們發現全都以 SQL 為開頭。除以上述分類外,各個函式在其必要性或複雜度上, 更被規定在不同的幾個層級中 ODBC 函式的層級為核心層(Core level),第一層(Level 1),和第二層(Level 2)。
我們再來看一個很基本的應用程式步驟是如何呢?
下圖告訴我們這個答案。
ODBC程式流程
回顧 ODBC 的架構及其執行過程,ODBC 造就了"應用程式獨立性(Application Independency)"的特性,使應用程式不需在乎資料來源是何種資料庫系統或者純粹是個資料或文本檔案,只要相對驅動程式能完成銜接的功能,則應用程式即可達到高度的獨立性。
二、ODBC 分為單束式和多束式兩類
ODBC 使用層次的方法來管理資料庫,在資料庫通信結構的每一層,對可能出現依賴資料庫產品自身特性的地方,ODBC 都引入一個公共接口以解決潛在的不一致性,從而很好地解決了基於資料庫系統應用程式的相對獨立性,這也是ODBC 一經推出就獲得巨大成功的重要原因之一。
從結構上分,ODBC 分為單束式和多束式兩類。
單束式驅動程式
單束式驅動程式介於應用程式和資料庫之間,像中介驅動程式一樣數據提供一個統一的數據訪問方式。
當用戶進行資料庫操作時,應用程式傳遞一個ODBC 函式調用給ODBC 驅動程式管理器,由ODBC API 判斷該調用是由它直接處理並將結果返回還是送交驅動程式執行並將結果返回。
由上可見,單束式驅動程式本身是一個資料庫引擎,由它直接可完成對資料庫的操作,儘管該資料庫可能位於網路的任何地方。
多束式驅動程式
多束式驅動程式負責在資料庫引擎和客戶應用程式之間傳送命令和數據,它本身並不執行數據處理操作而用於遠程操作的網路通信協定的一個界面。
前端應用程式提出對資料庫處理的請求,該請求轉給ODBC 驅動程式管理器,驅動程式管理器依據請求的情況,就地完成或傳給多束驅動程式,多束式驅動程式將請求翻譯為特定廠家的資料庫通信接口(如Oracle 的SQLNet)所能理解的形式並交於接口去處理,接口把請求經網路傳送給伺服器上的數據引擎,伺服器處理完後把結果發回給資料庫通信接口,資料庫接口將結果傳給多束式ODBC 驅動程式,再由驅動程式將結果傳給應用程式。
三、使用ODBC
在可以用ODBC做任何事之前,必須有一個資料庫棗至少在腦子裡。在一個像Access這樣的應用程式中創建資料庫框架通常會更容易一些,因為Access可以非常輕鬆地提供完成任務所需的各種功能。但是,如果你至少安裝了所需的ODBC驅動程式,那就可以在C++中創建程式框架。一設計了資料庫,就要為其創建ODBC數據源,我們會在本節中看到這一點。下面的過程並沒有嚴格地說明活動的經過,只是說明了一種配置數據源的技術。
注釋 我會在第5章中說明如何創建一個Access資料庫。現在,我們只是看一看,為了訪問那個資料庫,我們下一步要做些什麼。
1. 雙擊Control Panel(控制臺)中的32位ODBC小程式(如果當前系統上未安裝16位驅動程式,那么一些版本的Windows使用簡單的ODBC小程式)。你會看到ODBC Data Source Administrator(ODBC數據源管理員)對話框,如下圖所 DSN(用戶數據源名)選項卡。對系統級資料庫來說,使用System DSN(系統數據源名)選項卡;對檔案級數據源(從嚴格意義上說,它不是資料庫),使用File DSN(檔案數據源名)選項卡。你還會看到一個資料庫的預設選項。如果想從Visual C++內部創建資料庫,就會用到這個選項。
警告 對本地資料庫來說,通常要在User DSN(用戶DSN)選項卡上創建一個項;對遠程資料庫,則在System DSN(系統DSN)選項卡上創建。任何情況下,都不能在User DSN(用戶DSN)和System DSN(系統DSN)選項卡上創建同名的項。通常會出現的問題是,你試圖訪問遠程資料庫,但從Web伺服器獲得了非常奇怪和矛盾的錯誤訊息。事實上,如果在遠程資料庫訪問期間得到了奇怪的錯誤訊息,那么32位ODBC小程式是首先應該查看的地方之一。
2. 單擊Add按鈕。會看到Create New Data Source(創建新的數據源)對話框,如下圖所示。
技巧 檢查ODBC Data Source Administrator(ODBC數據源管理員)對話框的About選項卡,可以確定你正在使用的ODBC驅動程式的最新版本。這個選項卡包含了各種ODBC DLL的版本號、生產廠商的名稱以及出現在SYSTEM資料夾中的檔案名稱。大多數情況下,通過查看版本號可以驗證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(本資料庫包含食品存儲的庫存信息)。
6. 單擊Select(選擇)按鈕。你會看到一個File Open-type(檔案打開類型)對話框,可以在那裡選擇一個現有的資料庫。ODBC驅動程式會自動選擇正確的檔案擴展名。
技巧 並不是一定要提前設計資料庫。請注意,Access ODBC驅動程式還包括一個創建新資料庫的按鈕。很多ODBC驅動程式都提供了這種功能,但並不是全都這樣。單擊這個按鈕會啟動資料庫管理器應用程式,並允許你設計資料庫。注意有一點很有意思,Access ODBC驅動程式還會允許你使用這個對話框壓縮或修補資料庫。
7. 選擇系統資料庫選項。在大多數情況下要選擇None(無),除非你為應用程式特別創建了一個系統資料庫。如果確實添加了系統資料庫,它會出現在ODBC Microsoft Access 97 Setup(設定)對話框的System DSN(系統DSN)選項卡上。
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不包含資料庫所需的任何數據——它包含連線標準,其中可以包括從用戶列表到重要檔案位置的一切信息。
四、檔案DSN
你可能已經注意到了,上一節中的實例有問題。如果想單獨配置網路上的每一台機器,它會工作得很好,但這可能不是一個好主意。還有一種存儲創建數據源所需信息的方式:檔案DSN。這正是我們要在本節中討論的。下面的過程說明了設定檔案DSN的一般方法。
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(我的電腦)處結束,看到機器上所有驅動器的清單。
3. 單擊Add(添加),會看到Create New Data Source(創建新的數據源)對話框。
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(創建))。
8. 完成配置過程時單擊OK,你會在ODBC Data Source Administrator(ODBC數據源管理員)對話框中看到一個新的DSN檔案項。
和我們創建的前一個DSN不同,這個DSN實際上創建可以用文本編輯器來查看和編輯的檔案。圖4.1顯示了我的檔案的外觀。請注意,它符合標準的INI檔案格式。你可以在頂端看到【ODBC】標題。下面是我選擇的全部設定。這個檔案允許我從Visual C++選擇數據源,而機器間的傳輸也是非常容易的。我甚至能在安裝過程中按要求更改位置——在你不知道用戶會有什麼樣的設定時,這一點確實很不錯。
五、記錄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棗負責維持事務記錄。