1.開(kāi)放數(shù)據(jù)庫(kù)連接(ODBC API)
提供了一個(gè)通用的編程接口,允許程序與多種不同的數(shù)據(jù)庫(kù)連接。它為Oracle,SQL Server,MS Excel等都提供了驅(qū)動(dòng)程序,使得用戶可以使用SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行直接的底層功能操作。在使用ODBC API時(shí),用戶須引入的頭文件為"sql.h","sqlext.h","sqltypes.h"。用ODBC API創(chuàng)建數(shù)據(jù)庫(kù)應(yīng)用程序遵循一定的基本步驟:
第一步是分配ODBC環(huán)境,使一些內(nèi)部結(jié)構(gòu)初始化。完成這一步,須分配一個(gè)SQLHENV類型的變量在ODBC環(huán)境中做句柄使用。
第二步是為將要使用的每一個(gè)數(shù)據(jù)源分配一個(gè)連接句柄,由函數(shù)SQLALLocHandle()完成。
第三步是使用SQLConnect()把連接句柄與數(shù)據(jù)庫(kù)連接,可以先通過(guò)SQLSetConnectAttr()設(shè)置連接屬性。
然后就可以進(jìn)行SQL語(yǔ)句的操作,限于篇幅,相關(guān)的函數(shù)就不具體介紹了,讀者可以參考相關(guān)書(shū)籍。
操作完成后,用戶取回相應(yīng)的結(jié)果,就可以取消與數(shù)據(jù)庫(kù)的連接。
最后需要釋放ODBC環(huán)境。
ODBC API的特點(diǎn)是功能強(qiáng)大豐富,提供了異步操作,事務(wù)處理等高級(jí)功能,但相應(yīng)的編程復(fù)雜,工作量大。
2.MFC ODBC類
MFC1.5后的版本里引入封裝了ODBC功能的類。通過(guò)這些類提供與ODBC的接口,使得用戶可以不須處理ODBC API中的繁雜處理就可以進(jìn)行數(shù)據(jù)庫(kù)操作。主要的MFC ODBC類如下。
CDatabase類:一個(gè)CDatabase對(duì)象表示一個(gè)到數(shù)據(jù)源的連接,通過(guò)它可以操作數(shù)據(jù)源。應(yīng)用程序可使用多個(gè)CDatabase對(duì)象:構(gòu)造一個(gè)對(duì)象并調(diào)用OpenEx()成員函數(shù)打開(kāi)一個(gè)連接。接著構(gòu)造CRecordSet對(duì)象以操作連接的數(shù)據(jù)源,并向CDatabase對(duì)象傳遞記錄集構(gòu)造程序指針。完成使用后用Close()成員函數(shù)銷毀CDatabase對(duì)象。一般情況下并不需要直接使用CDatabase對(duì)象,因?yàn)镃RecordSet對(duì)象可以實(shí)現(xiàn)大多數(shù)的功能。但是在進(jìn)行事務(wù)處理時(shí),CDatabase就起到關(guān)鍵作用。事務(wù)(Transaction)指的是將一系列對(duì)數(shù)據(jù)源的更新放在一起,同時(shí)提交或一個(gè)也不提交,為的是確保多用戶對(duì)數(shù)據(jù)源同時(shí)操作時(shí)的數(shù)據(jù)正確性。
CRecordSet類:一個(gè)CRecordSet對(duì)象代表一個(gè)從數(shù)據(jù)源選擇的一組記錄的集合-記錄集。記錄集有兩種形式:snapshot和dynaset。前者表示數(shù)據(jù)的靜態(tài)視圖,后者表示記錄集與其他用戶對(duì)數(shù)據(jù)庫(kù)的更新保持同步。通過(guò)CRecordSet對(duì)象,用戶可以對(duì)數(shù)據(jù)庫(kù)中的記錄進(jìn)行各種操作。
CRecordView類:CRecordView對(duì)象是在空間中顯示數(shù)據(jù)庫(kù)記錄的視圖。這種視圖是一種直接連到一個(gè)CRecordSet對(duì)象的格式視圖,它從一個(gè)對(duì)話框模板資源創(chuàng)建,并將CRecordSet對(duì)象的字段顯示在對(duì)話框模板的控件里。對(duì)象利用DDX和RFX機(jī)制,使格式上的控件和記錄集的字段之間數(shù)據(jù)移動(dòng)自動(dòng)化,也就是說(shuō),用戶甚至不要編寫(xiě)一行代碼就可以實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)庫(kù)記錄查看程序。
CDBException類:由Cexception類派生,以三個(gè)繼承的成員變量反映對(duì)數(shù)據(jù)庫(kù)操作時(shí)的異常:
m_nRetCode:以O(shè)DBC返回代碼(SQL_RETURN)的形式表明造成異常的原因。
m_strError:字符串,描述造成拋出異常的錯(cuò)誤原因。
m_strStateNativeOrigin:字符串,用以描述以O(shè)DBC錯(cuò)誤代碼表示的異常錯(cuò)誤。
MFC數(shù)據(jù)庫(kù)類成員函數(shù)都能拋出CDBException類型的異常,所以在代碼對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作后監(jiān)測(cè)異常是正確做法。
MFC ODBC類在實(shí)際開(kāi)發(fā)中應(yīng)用最廣,因?yàn)樗δ茇S富,操作相對(duì)簡(jiǎn)便。
3.MFC DAO(數(shù)據(jù)訪問(wèn)對(duì)象)編程
DAO用于和微軟的Access數(shù)據(jù)庫(kù)接口。在數(shù)據(jù)庫(kù)應(yīng)用程序如果只需與Access數(shù)據(jù)庫(kù)接口時(shí),使用DAO編程較方便。其主要類如下。
CDaoWorkspace:CDaoWorkspace對(duì)象可以讓一個(gè)用戶管理從登陸到離開(kāi)期間,指定的密碼保護(hù)的數(shù)據(jù)庫(kù)會(huì)話全過(guò)程。大多數(shù)情況下不要多個(gè)工作區(qū)也不要?jiǎng)?chuàng)建明確的工作區(qū)對(duì)象。因?yàn)樵诖蜷_(kāi)數(shù)據(jù)庫(kù)和記錄集對(duì)象時(shí),它們可以使用DAO缺省工作區(qū)。
CDaoDatabase:代表一個(gè)連接,類似上述CDatabase類。
CDaoRecordSet:用來(lái)選擇記錄集并操作,類似上述CRecordSet類。
CDaoRecordView:類似上述CRecordView類。
CDaoException:類似上述CDBException類。
CDaoTableDef:表示基本表或附加表的定義。每個(gè)DAO數(shù)據(jù)庫(kù)對(duì)象包括一個(gè)稱為T(mén)ableDef的收集,包含所有存儲(chǔ)的DAO表定義對(duì)象。CDaoTableDef對(duì)象可以用來(lái)控制表定義。
CDaoQueryDef:CDaoQueryDef對(duì)象表示了一個(gè)查詢定義(querydef)。
CDaoFieldExchange:支持?jǐn)?shù)據(jù)庫(kù)類使用的DAO字段交換(DFX)例程。也可處理事務(wù),類似MFC ODBC類。
MFC DAO僅用來(lái)支持Access數(shù)據(jù)庫(kù),應(yīng)用范圍相對(duì)固定。
4.OLE DB
OLE DB在數(shù)據(jù)提供程序和用戶之間提供了靈活的組件對(duì)象模型(COM)接口,這種靈活性有時(shí)會(huì)使得操作復(fù)雜化。OLE DB框架定義了應(yīng)用的三個(gè)基本類。
數(shù)據(jù)提供程序Data Provider:擁有自己的數(shù)據(jù)并以表格形式顯示數(shù)據(jù)的應(yīng)用程序。提供OLE DB的行集COM接口,期顯示范圍可以從單一數(shù)據(jù)表格的簡(jiǎn)單提供者知道更復(fù)雜的分布式數(shù)據(jù)庫(kù)系統(tǒng)。
使用者Consumers:使用OLE DB接口對(duì)存儲(chǔ)在數(shù)據(jù)提供程序中的數(shù)據(jù)進(jìn)行控制的應(yīng)用程序。用戶應(yīng)用程序歸為使用類。
服務(wù)提供程序Service Provider:是數(shù)據(jù)提供程序和使用者的組合。服務(wù)提供程序沒(méi)有自己的數(shù)據(jù),但使用
OLE DB使用者接口來(lái)訪問(wèn)存儲(chǔ)在數(shù)據(jù)提供程序中的數(shù)據(jù)。然后,服務(wù)提供程序通過(guò)打開(kāi)數(shù)據(jù)提供程序接口使得數(shù)據(jù)對(duì)使用者有效。服務(wù)提供程序常用于向應(yīng)用程序提供高層次服務(wù),比如高級(jí)分布式查詢。
OLE DB編程時(shí),用戶使用組件對(duì)象開(kāi)發(fā)應(yīng)用程序。這些組件有:
枚舉器:用于列出可用的數(shù)據(jù)源;
數(shù)據(jù)源:代表單獨(dú)的數(shù)據(jù)和服務(wù)提供程序,用于創(chuàng)建對(duì)話;
對(duì)話:用于創(chuàng)建事務(wù)和命令;
事務(wù):用于將多個(gè)操作歸并為單一事務(wù)處理;
命令:用于向數(shù)據(jù)源發(fā)送文本命令(SQL),返回行集;
錯(cuò)誤:用于獲得錯(cuò)誤信息。
5.ActiveX數(shù)據(jù)對(duì)象(ADO)
是微軟提供的面向?qū)ο蟮慕涌?,與OLE DB類似,但接口更簡(jiǎn)單,具有更廣泛的特征數(shù)組和更高程度的靈活性。ADO基于COM,提供編程語(yǔ)言可利用的對(duì)象,除了面向VC++,還提供面向其他各種開(kāi)發(fā)工具的應(yīng)用,如VB,VJ等。ADO在服務(wù)器應(yīng)用方面非常有用,特別是對(duì)于動(dòng)態(tài)服務(wù)器頁(yè)面ASP(Active Server Page)。
ADO對(duì)象結(jié)構(gòu)類似于OLE DB,但并不依靠對(duì)象層次。大多數(shù)情況下,用戶只需要?jiǎng)?chuàng)建并只使用需要處理的對(duì)象。下面的對(duì)象類組成了ADO接口。
Connection:用于表示與數(shù)據(jù)庫(kù)的連接,以及處理一些命令和事務(wù)。
Command:用于處理傳送給數(shù)據(jù)源的命令。
Recordset:用于處理數(shù)據(jù)的表格集,包括獲取和修改數(shù)據(jù)。
Field:用于表示記錄集中的列信息,包括列值和其他信息。
Parameter:用于對(duì)傳送給數(shù)據(jù)源的命令之間來(lái)回傳送數(shù)據(jù)。
Property:用與操作在ADO中使用的其他對(duì)象的詳細(xì)屬性。
Error:用于獲得可能發(fā)生的錯(cuò)誤的詳細(xì)信息。
在VC++使用ADO需要進(jìn)行COM操作,詳細(xì)方法在此就不贅述了。