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