摘要:該文對(duì)VC的數(shù)據(jù)庫(kù)編程特點(diǎn)進(jìn)行了分析,指出了它的優(yōu)勢(shì)所在。然后分析了兩種VC編程的模式,并且詳細(xì)給出了ADO方式的具體實(shí)例。最后進(jìn)一步指出VC下的ADO方式是一種較好的數(shù)據(jù)庫(kù)應(yīng)用方法。
關(guān)鍵詞:VC;數(shù)據(jù)庫(kù);ADO;ODBC;計(jì)算機(jī)應(yīng)用
中圖分類號(hào):TP311文章標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2009)26-7338-02
VC++作為Windows平臺(tái)上最優(yōu)秀的C++編程環(huán)境之一,它既能面向?qū)ο笥志哂幸恍┢渌奶攸c(diǎn)。雖然學(xué)習(xí)、應(yīng)用VC要了解很多Windows平臺(tái)的特性并且還要掌握ATL、COM等的知識(shí),難度比較大,但它仍然是一個(gè)對(duì)底層支持非常好的、必不可少的優(yōu)秀編程環(huán)境。特別是它的MFC編程方式:MFC是一個(gè)很大的、擴(kuò)展了的C++類層次結(jié)構(gòu),它能使開發(fā) Windows 應(yīng)用程序變得更加容易。在數(shù)據(jù)庫(kù)開發(fā)中,VC也是一個(gè)強(qiáng)大的工具,本文就是分析在VC環(huán)境下的數(shù)據(jù)庫(kù)開發(fā),希望能夠起到拋磚引玉的作用。
1 VC數(shù)據(jù)庫(kù)編程的特點(diǎn)
對(duì)于像dBASE IV,F(xiàn)oxPro,Oracle和Access這樣的產(chǎn)品是完全以數(shù)據(jù)庫(kù)管理為中心的,這些產(chǎn)品非常善于創(chuàng)建數(shù)據(jù)庫(kù)管理器。在應(yīng)用這些商業(yè)數(shù)據(jù)庫(kù)的時(shí)候,使用VisualBasic和Delphi等環(huán)境就可以協(xié)助來實(shí)現(xiàn)構(gòu)建這種管理器。實(shí)際上應(yīng)用這些軟件,編寫成熟的、用戶界面良好的、具有高速搜索能力的數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS非常的簡(jiǎn)單。所以實(shí)際上從方便的角度講,VisualBasic和Delphi這樣的RAD環(huán)境更加適合于數(shù)據(jù)庫(kù)開發(fā),應(yīng)用這些軟件可以在使程序設(shè)計(jì)非常地容易。對(duì)大多數(shù)數(shù)據(jù)庫(kù)應(yīng)用來說,選擇VC++也許并不適宜。
但是需要考慮到,單純的數(shù)據(jù)庫(kù)管理必須要和其它的功能結(jié)合才能發(fā)揮更大的作用,而數(shù)據(jù)庫(kù)軟件并不輕易地支持這些拓展的功能。這時(shí)為了實(shí)現(xiàn)各種復(fù)雜的功能,Visual C++就可以提供的一些重要東西。由于VC對(duì)底層強(qiáng)大的支持,其高效的率的代碼結(jié)構(gòu),編寫的數(shù)據(jù)庫(kù)相關(guān)應(yīng)用程序就會(huì)有規(guī)模小、提供底層訪問并能提供實(shí)時(shí)訪問的特點(diǎn)。比如編寫數(shù)據(jù)庫(kù)實(shí)用程序及驅(qū)動(dòng)程序時(shí),可以選擇Visual C++語(yǔ)言;又比如在硬盤較小或內(nèi)存有限制時(shí),Visual C++提供了無價(jià)無限的工具。
2 VC數(shù)據(jù)庫(kù)編程的方式
2.1 ODBC方式
Microsoft最初是以開放數(shù)據(jù)庫(kù)互連(ODBC)為目標(biāo)的, ODBC是Microsoft引進(jìn)的一種早期數(shù)據(jù)庫(kù)接口技術(shù),是ADO的前身。Microsoft引進(jìn)這種技術(shù)的一個(gè)主要原因是,以非語(yǔ)言專用的方式提供給程序員一種訪問數(shù)據(jù)庫(kù)內(nèi)容的簡(jiǎn)單方法。它使得編程人員在訪問DBF文件或Access Basic得到MDB文件中的數(shù)據(jù)時(shí),無需懂得Xbase程序設(shè)計(jì)語(yǔ)言。ODBC工作起來和Windows一樣,它用包含在DLL內(nèi)的驅(qū)動(dòng)程序完成任務(wù)。ODBC提供一套兩個(gè)驅(qū)動(dòng)程序:一個(gè)是數(shù)據(jù)庫(kù)管理器的語(yǔ)言,另一個(gè)為程序設(shè)計(jì)語(yǔ)言提供公用接口。允許Visual C++用標(biāo)準(zhǔn)的函數(shù)調(diào)用經(jīng)公用接口訪問數(shù)據(jù)庫(kù)的內(nèi)容,是這兩個(gè)驅(qū)動(dòng)程序的匯合點(diǎn)。當(dāng)然,還有其它和ODBC有關(guān)的實(shí)用程序類型的DLL。例如,一個(gè)這樣的DLL允許管理ODBC數(shù)據(jù)源。
2.2 ADO方式
要理解ADO方式需要首先了解OLE-DB的含義。顧名思義OLE-DB用OLE(或者更具體一點(diǎn),是部件對(duì)象模型COM)為數(shù)據(jù)訪問提供一套接口。就像任何其它的COM對(duì)象一樣,可以查詢、創(chuàng)建和撤銷一個(gè)OLE-DB對(duì)象。OLE-DB對(duì)象的來源被稱為提供者。各種OLE-DB提供者是Visual C++軟件包的一部分,也有可能在廠商升級(jí)其數(shù)據(jù)庫(kù)產(chǎn)品時(shí)提供。OLE-DB的好處是,同一個(gè)提供者可以和任何Visual Studio產(chǎn)品協(xié)作:Visual C++,Visual Basic,Visual InterDev和Visual J++。OLE-DB還依賴于事件,這和任何COM對(duì)象一樣。這些事件說明什么時(shí)候要求更新數(shù)據(jù)庫(kù)表,以顯示其它用戶生成的新項(xiàng),或者所請(qǐng)求的表什么時(shí)候準(zhǔn)備好供查看。還會(huì)看到這樣的事件,它們用來發(fā)送信號(hào)通知各種數(shù)據(jù)庫(kù)錯(cuò)誤和其它要求馬上輪詢的活動(dòng)。
而ADO并不是數(shù)據(jù)庫(kù)訪問的底層解決方案。OLE-DB是使用ADO的基礎(chǔ);它也提供與數(shù)據(jù)庫(kù)通信的基礎(chǔ)。ADO只是OLE-DB提供的服務(wù)的包裝。事實(shí)上甚至可以繞過ADO而直接使用OLE-DB,但是使用ADO開發(fā)應(yīng)用程序的速度要快得多。
3 VC數(shù)據(jù)庫(kù)編程實(shí)例
ADO既能應(yīng)用到VC的強(qiáng)大功能,而且使用起來又比較方便,本文以ADO方式數(shù)據(jù)庫(kù)訪問為例,展示VC下如何進(jìn)行數(shù)據(jù)庫(kù)應(yīng)用。
3.1 ADO數(shù)據(jù)庫(kù)開發(fā)基本流程
1)初始化COM庫(kù),引入ADO庫(kù)定義文件;2)用Connection對(duì)象連接數(shù)據(jù)庫(kù);3)利用建立好的連接,通過Connection、Command對(duì)象執(zhí)行SQL命令,或利用Recordset對(duì)象取得結(jié)果記錄集進(jìn)行查詢、處理;(4)使用完畢后關(guān)閉連接釋放對(duì)象。
3.2 實(shí)例—BLOG數(shù)據(jù)保存
在實(shí)際的開發(fā)過程中常常需要存儲(chǔ)較大的二進(jìn)制數(shù)據(jù)對(duì)象,比如圖像、音頻文件、或其它二進(jìn)制數(shù)據(jù),這些數(shù)據(jù)稱之為二進(jìn)制大對(duì)象BLOB(Binary Large Object),其存取的方式與普通數(shù)據(jù)有所區(qū)別。這里利用ADO在數(shù)據(jù)庫(kù)中存取BLOB數(shù)據(jù)的具體實(shí)現(xiàn)過程。BLOB類型的數(shù)據(jù)無法用普通的方式進(jìn)行存儲(chǔ),需要使用AppendChunk函數(shù),AppendChunk包含在Field對(duì)象中,原型如下:HRESULT AppendChunk (const _variant_t Data );從函數(shù)原型中可以看到關(guān)鍵的問題是需把二進(jìn)制數(shù)據(jù)賦值給VARIANT類型的變量,下面給出具體的代碼并作簡(jiǎn)單的分析。
///假設(shè)m_pBMPBuffer指針指向一塊長(zhǎng)度為m_nFileLen的二進(jìn)制數(shù)據(jù),并且已經(jīng)成功打開了記錄集對(duì)象m_pRecordset///
char*pBuf = m_pBMPBuffer; VARIANTvarBLOB; SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
m_pRecordset->AddNew();///添加新記錄
m_pRecordset->PutCollect(\"username\",_variant_t(\"小李\")); ///為新記錄填充username字段
m_pRecordset->PutCollect(\"old\",_variant_t((long)28); ///填充old字段
if(pBuf)
{ rgsabound[0]. Lbound = 0;
rgsabound[0].cElements = m_nFileLen;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///創(chuàng)建SAFEARRAY對(duì)象
for (long i = 0; i < (long)m_nFileLen; i++)
SafeArrayPutElement (psa, i, pBuf++);
///將pBuf指向的二進(jìn)制數(shù)據(jù)保存到SAFEARRAY對(duì)象psa中
varBLOB.vt = VT_ARRAY | VT_UI1; ///將varBLOB的類型設(shè)置為BYTE類型的數(shù)組
varBLOB.parray = psa; ///為varBLOB變量賦值
m_pRecordset->GetFields()->GetItem(\"photo\")->AppendChunk(varBLOB);
///加入BLOB類型的數(shù)據(jù)}
m_pRecordset->Update();///保存數(shù)據(jù)到庫(kù)中
至此數(shù)據(jù)已經(jīng)成功地保存到了數(shù)據(jù)庫(kù)中。
4 總結(jié)
ADO是Microsoft數(shù)據(jù)庫(kù)應(yīng)用程序開發(fā)的新接口,是建立在OLE /DB之上的高層數(shù)據(jù)庫(kù)訪問技術(shù),即使對(duì)OLE/DB,COM不了解也能輕松應(yīng)用ADO。在VC下應(yīng)用ADO方式進(jìn)行數(shù)據(jù)庫(kù)開發(fā)既能應(yīng)用到VC的優(yōu)良特性,又不失簡(jiǎn)便,是一種值得推薦的方法。
參考文獻(xiàn):
[1] 張慧平.電網(wǎng)中利用ODBC實(shí)現(xiàn)對(duì)歷史數(shù)據(jù)庫(kù)的訪問[J].航空精密制造技術(shù),1998.34(6):42-44.
[2] 王聰華.ADO訪問數(shù)據(jù)庫(kù)實(shí)例剖析[J].計(jì)算機(jī)應(yīng)用研究,2002(5):159-160.
[3] 鄭章,程剛,張勇.Visual C++6.0數(shù)據(jù)庫(kù)開發(fā)技術(shù)[M].北京:機(jī)械工業(yè)出版社,1999.