通過ODBC 管理器可以增添、修改或刪除數(shù)據(jù)源,也可以增添、刪除ODBC驅(qū)動程序,ODBC管理器把數(shù)據(jù)源和它們的連接信息保存在ODBC. INI、ODBCINST. INI和ODBCISAM.INI中。當需要共享應(yīng)用程序時,只需按新的數(shù)據(jù)文件的類型和位置重新登錄即可。
1. ODBC應(yīng)用程序接口
ODBC API是一組標準的ODBC函數(shù)庫,除了一般的數(shù)據(jù)庫操作函數(shù)外,還包括一組函數(shù)(如SQLExec或SQLEx- ecdlrect)能夠內(nèi)嵌標準SQL查詢語句。SQL(StructuredQuery Language,結(jié)構(gòu)化查詢語言)是一種存取關(guān)系型數(shù)據(jù)庫的標準語言,能夠定義、查詢、修改和控制數(shù)據(jù),簡單的語句能夠作用于整個數(shù)據(jù)表格,具有很強的功能。API 函數(shù)按功能可分為以下幾類(順序也表示了進行數(shù)據(jù)庫操作的順序):
(1)數(shù)據(jù)源連接函數(shù),設(shè)置/獲取有關(guān)信息的函數(shù);
(2)準備/提交執(zhí)行SQL查詢語句的函數(shù)和獲得數(shù)據(jù)的函數(shù);
(3)終止函數(shù)和異常處理函數(shù)。
有兩個問題需要特別說明:一是數(shù)據(jù)類型問題,數(shù)據(jù)源中的數(shù)據(jù)所具有的數(shù)據(jù)類型稱為SQL數(shù)據(jù)類型,不一定和ODBCSQL數(shù)據(jù)類型存儲方式一致,驅(qū)動程序把這些數(shù)據(jù)類型同ODBCSQL數(shù)據(jù)類型進行相互轉(zhuǎn)換;二是函數(shù)的調(diào)用級別問題,并不是每一個ODBC驅(qū)動程序都支持所有的ODBC API函數(shù)調(diào)用。
2.ODBC應(yīng)用編程
在Visual C++中,MFC(Microsoft Foundation Class)為ODBC預(yù)定義了幾個類,其中主要的是數(shù)據(jù)庫類和記錄集合類。CDatabase的每一個對象代表了一個數(shù)據(jù)源的連接,CRecordset的每一個對象代表了從一個數(shù)據(jù)表中按預(yù)定的查詢條件獲得的記錄的集合,一般說來,前者適宜于對數(shù)據(jù)源下的某個數(shù)據(jù)表格進行整體操作,后者用于對所選的記錄集合進行處理。
在應(yīng)用編程時,一般使用CDatabase和CRecordset的派生類。假設(shè)派生類分別為CUserdb和CUserset,而在應(yīng)用類CUserClass中,使用了一個CUserdb對象(m-db)和一個Cuserset對象。
2.1m-db連接數(shù)據(jù)源
m-db在完成定義構(gòu)造后,要調(diào)用 CDatabase的打開(Open)函數(shù)以進行數(shù)據(jù)源的實際連接:
m-db.Open(lpszDSN,bExclusive,bReadOnly,lpsz-Connect)
打開函數(shù)需要輸入四個參數(shù)。lpszDSN:要連接的數(shù)據(jù)源的名字,如果 IpszDSN = NULL且 lpszConnect 中也沒有指明數(shù)據(jù)源名,則該調(diào)用會自動出現(xiàn)一個對話框列出所有可用的數(shù)據(jù)源(名),讓用戶選擇。bExclusive:只支持“假”(False)值,表示為共享(share)方式連接。ReadOnly:指明數(shù)據(jù)源操作方式是“只讀”還是可以修改。lpszConnect:指明連接字符串,包括數(shù)據(jù)源名、用戶標識碼、口令等信息。該字符串必須以“ODBC;”開頭,表示該連接是與一個ODBC數(shù)據(jù)源的連接(考慮以后版本支持非ODBC數(shù)據(jù)源)。
2.2m-db操作數(shù)據(jù)
數(shù)據(jù)源打開后,即可對數(shù)據(jù)庫文件中的數(shù)據(jù)表格進行操作,操作以調(diào)用SQL語句方式進行,可直接通過ODBC API函數(shù),或者CDatabase類成員函數(shù)ExecuteSQL。數(shù)據(jù)表名在SQL 語句中指定,如下語句則在所在的數(shù)據(jù)源中的 clerk 表中插入一個記錄,記錄的name字段值為“chen”。
m-db.ExecuteSQL("insert into clerk (name) value('chent')")
2.3m-recset操作數(shù)據(jù)
記錄集合生成后,其當前記錄的各字段值被保存在前述的各字段變量中,如果調(diào)用CRecordset的滾動函數(shù),如MoveFirst,MoveNext,MovePrev,MoveLast等,字段變量的值將自動跟隨“當前”記錄的位置的變化而變化。IsBOF,IsEOF用于判別是否移動到記錄的頭或尾。對于AddNew和Edit,修改字段變量后一定要調(diào)用函數(shù)Update,否則更新將丟失;而Delete操作則不必進行字段值修改和調(diào)用Update。在多用戶系統(tǒng)使用時,每一個數(shù)據(jù)源可以被多個用戶的多個任務(wù)連接,不同的任務(wù)可同時修改相同的數(shù)據(jù)源。ODBC 提供了兩種數(shù)據(jù)表更新的同步機制(在m-recset.Open函數(shù)中指定),“靜態(tài)”的和動態(tài)的。前者是一組靜態(tài)的記錄集合,當建立后不會改變,除了反映自己的添加/刪除外,不反映別的用戶的修改,除非調(diào)用了Requery重新建立。后者是一組動態(tài)的記錄集合,自己或別的用戶所作的修改隨時反映到集合中來(當然也可用Requery重建),以保持記錄與數(shù)據(jù)源的同步。
3.總結(jié)
從以上討論可以看出,ODBC應(yīng)用接口十分簡便!再加上Visual C++ 中的AppWizard和ClassWizard自動生成框架代碼功能,連接一個數(shù)據(jù)源,生成一個CRecordset對象,就更快捷了。應(yīng)用程序只需關(guān)心數(shù)據(jù)的處理而不必費心數(shù)據(jù)的存取,另外,另一個與ODBC有關(guān)的類CRecordView,是一個窗口類CWnd的派生類,建立在CRecordset上,可直接構(gòu)造數(shù)據(jù)庫記錄顯示窗口,某些情況下也不妨一用。