摘要:用VC++開發(fā)一個(gè)管理系統(tǒng),要使用數(shù)據(jù)庫對所需的數(shù)據(jù)進(jìn)行存儲與管理。該文介紹了Visual C++訪問開發(fā)數(shù)據(jù)庫的幾種技術(shù)概況及其訪問的方法:ODBC,DAO,OLE/DB和ADO,并對各種技術(shù)的使用范圍、訪問效率、工作穩(wěn)定性等進(jìn)行了比較,并給出了基本使用方法。
關(guān)鍵詞:ODBC;DAO;OLE/DB;ADO
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2009)05-1051-02
VC++ to Access the Database of the Method
ZHAO Mei-li1,TANG Jing2
(1.Naval Academy Computer Department of Bengbu,Bengbu 233000,China;2.Fengyang Normal school,F(xiàn)engyang 233100,China)
Abstract: Develops a management system management system with VC++ must use the database to carry on the memory and the management the data which needs. This paper introduces the Visual C + + to access the database of profiles and their visit to several technical approaches: ODBC, DAO, OLE/DB and ADO,and the use of various technologies, access efficiency, job stability, etc. were compared, and gives the basic use.
Key words:ODBC; DAO; OLE/DB; ADO
1 引言
隨著Visual C++軟件開發(fā)工具的廣泛推廣記載數(shù)據(jù)庫方面的應(yīng)用日趨廣泛和深入,越來越多的軟件開發(fā)人員和愛好者希望理解并掌握應(yīng)用Visual C++管理開發(fā)數(shù)據(jù)庫的技術(shù)和方法。VC++提供了幾種接口(ODBC、DAO、OLE/DB、ADO)來支持?jǐn)?shù)據(jù)庫編程,利用這些接口可以在程序中直接操作各種各樣的數(shù)據(jù)庫,如(SQL Server、Microsoft Access、Microsoft FoxPro等等。
2 ODBC
ODBC(Open Database Connection 開放數(shù)據(jù)庫互連)是一種使用SQL的數(shù)據(jù)庫應(yīng)用程序設(shè)計(jì)接口。它建立了一組規(guī)范,并提供了一組對數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)API(應(yīng)用程序編程接口),為ODBC編程提供了一個(gè)面向?qū)ο蟮姆椒?,這使得利用MFC來創(chuàng)建ODBC的應(yīng)用程序非常方便。在使用ODBC API時(shí),用戶須引入的頭文件“sql.h”,”sqlext.h”,”sqhypes.h”。MFC對ODBC的封裝主要是開發(fā)了Cdatabase類和CRecordSet類[1]。
Cdatabase類:該類可以實(shí)現(xiàn)對數(shù)據(jù)源的操作。通過構(gòu)造Cdatabase類對象,調(diào)用它的Open或者OpenEx成員函數(shù)建立數(shù)據(jù)源連接。CRecordSet類:記錄集類提供從數(shù)據(jù)源中提取的結(jié)果記錄集并對其進(jìn)行操作。它通過SQL語句返回,可以對表和視圖進(jìn)行查詢或存儲。要注意的是在應(yīng)用程序中,一般不直接使用CRecordSet類而是使用其派生類,因?yàn)楫?dāng)使用MFC Class Wizard 產(chǎn)生一個(gè)CRecordSet類的派生類時(shí)MFC Class Wizard會(huì)自動(dòng)添加相應(yīng)數(shù)據(jù)庫表中字段的成員變量并自動(dòng)重載CRecordSet類的成員函數(shù)DoFieldExchange()。通過使用RFX函數(shù)來完成數(shù)據(jù)庫字段與記錄集字段數(shù)據(jù)成員變量的數(shù)據(jù)交換。在程序中使用MFC ODBC,除登錄數(shù)據(jù)源之外,還需要在stdafx.h中包含afxdb.h。
3 DAO
ODBC的優(yōu)點(diǎn)是它的使用比較簡單,只要登錄Windows控制面板中的數(shù)據(jù)源,就可以使ODBC連接到相應(yīng)的數(shù)據(jù)庫。但是使用ODBC訪問數(shù)據(jù)庫速度較慢,同時(shí)ODBC德爾使用需要很多相應(yīng)的部件支持。DAO克服了ODBC的一些缺陷,由于它實(shí)際上使通過Microsoft Jet數(shù)據(jù)庫引擎來訪問數(shù)據(jù)庫,所以DAO方法非常適合訪問Jet型數(shù)據(jù)庫(.mdb),同時(shí)使用DAO方法不需要登錄數(shù)據(jù)源,只要指明數(shù)據(jù)庫的路徑即可。
VC++的ODBC和DAO方法在使用形式上比較相似, ODBC訪問記錄集的基類是CRecordSet,DAO則為CdaoRecordSet,差別就是加上“DAO”,通過定義這些類的對象并調(diào)用相應(yīng)的成員函數(shù)就可以實(shí)現(xiàn)Access數(shù)據(jù)庫和表的動(dòng)態(tài)創(chuàng)建。ODBC存取數(shù)據(jù)庫時(shí)使用RFX_LongBinary。使用AppWizard的過程基本上與使用ODBC時(shí)相似,只是在選擇數(shù)據(jù)源時(shí)要選擇已建立好的DAO數(shù)據(jù)源,在后從系統(tǒng)中選出源數(shù)據(jù)庫和表,令其自動(dòng)生成這部分的代碼。在應(yīng)用程序中使用MFC DAO可以通過以下步驟來實(shí)現(xiàn):
首先應(yīng)確保在stdafx.h頭文件中包含了afxdao.h頭文件:
#include“afxdao.h”
接著創(chuàng)建自己的CdaoRecordSet類(設(shè)為MydaoRecordSet),并使它與你所需要的數(shù)據(jù)庫的表相連。同時(shí)在文檔類的OnOpenDocument()函數(shù)中加入
m_pdb=newCDaodatabase
m_pdb->open();
m_pset= newMydaoRecordSet(m_pdb);
m_pset->open();
最后創(chuàng)建自己的對話框,選擇ClassWizard的ClassInfo頁。在ForeignClass項(xiàng)填入先前所創(chuàng)建的MydaoRecordSet,在ForeignVariable項(xiàng)填入m_pset,并對各個(gè)edit欄用變量映射。
4 OLE/DB
DAO也存在較大的缺點(diǎn):主要是MFC DAO與Jet數(shù)據(jù)庫引擎之間的版本。由于Visual C++.NET環(huán)境和向?qū)Р辉僦С諨AO(雖然仍包括DAO類),用戶必須手工編寫過去由向?qū)?zhí)行的任務(wù),Microsoft建議新項(xiàng)目采用OLE/DB模板或ODBC。OLE DB是基于COM借口的訪問數(shù)據(jù)庫的新技術(shù)[2],所以它繼承了COM接口所有特性,具有較好的穩(wěn)定性,由于接口的標(biāo)準(zhǔn)性,使得程序可以被應(yīng)用到任何提供了數(shù)據(jù)程序的數(shù)據(jù)源,因此使用OLE DB開發(fā)的程序具有比較好的移植性。另外OLE DB通過將數(shù)據(jù)庫的功能分為客戶和服務(wù)器兩個(gè)方面,提高了數(shù)據(jù)庫訪問效率。前面提到的傳統(tǒng)數(shù)據(jù)庫訪問技術(shù)(ODBC、DAO)都只能訪問關(guān)系型數(shù)據(jù)庫,而OLE DB可以訪問任何形式的文件系統(tǒng),包括傳統(tǒng)的關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)源及用戶自定義的文件格式。但是在基于COM技術(shù)的數(shù)據(jù)庫訪問中通常使用ADO技術(shù)而不是OLE/DB。
5 ADO
ADO對象模型包括了7個(gè)對象:1)數(shù)據(jù)連接(Connection)對象建立一個(gè)數(shù)據(jù)交換環(huán)境,應(yīng)用程序通過Connection訪問數(shù)據(jù);2)命令(Command)對象通過已建立的Connection發(fā)布命令完成操作數(shù)據(jù)庫功能;3)記錄集(RecordSet)對象存儲查詢命令返回的結(jié)果;4)錯(cuò)(Error)對象時(shí)記錄應(yīng)用ADO過程中出現(xiàn)錯(cuò)誤的信息;5)屬性(Property)對象代表數(shù)據(jù)提供者的具體屬性;6)字段(Field)對象代表一個(gè)記錄集的一個(gè)域;7)參數(shù)(Parameter)對象代表SQL存儲過程或有參數(shù)查詢中的參數(shù)。其中Connection、Command和RecordSet三個(gè)對象是主體對象,它們可以被獨(dú)立創(chuàng)建和釋放。Connection對象是用來建立和維護(hù)與數(shù)據(jù)源的連接,對數(shù)據(jù)創(chuàng)建和執(zhí)行對數(shù)據(jù)庫的操作命令,可以使用該對象執(zhí)行SQL語句或調(diào)用存儲過程;Command對象執(zhí)行后將返回一個(gè)RecordSet對象。RecordSet對象包含執(zhí)行數(shù)據(jù)庫操作后返回的一個(gè)記錄集。通過該對象可以瀏覽和更新數(shù)據(jù)庫中保存的記錄[3]。
4.1 ADO對象與數(shù)據(jù)源的連接
ADO是基于COM技術(shù)的,因此在使用ADO對象之前必須初始化COM環(huán)境,在VC工程應(yīng)用類Initinstance的成員函數(shù)中添加如下初始化COM環(huán)境的代碼:
::Coinitialize(NULL);
1) 在MFC中沒有可與ADO一起使用的類,因此若要在Visual C++程序中使用ADO對象,首先需要導(dǎo)入ADO動(dòng)態(tài)鏈接庫,在創(chuàng)建的VC工程的stadafx.h頭文件中添加如下代碼[4]:
#import“C:\\Program Files\\Common Files\\System\\ado\\msadol5.DLL\o_namespace”
Rename(“EOF”,“EndOfFile”);
其中no_namespace屬性表示編譯器不繼承本身的命名空間,rename(“EOF”,”EndOfFile)表示將所有“EOF”替換為“EndOfFile”。為了方便使用ADO的各個(gè)類,應(yīng)該在程序開頭調(diào)用#import指令,在ADO的類庫中包含了3個(gè)智能指針ConnectionPtr、CommandPtr和RecordSetPtr,其中ConnectionPtr指針用來管理連接一個(gè)數(shù)據(jù)源提供者所要求的信息,它提供了很多方法如Open和Close可以打開和關(guān)閉一個(gè)到數(shù)據(jù)庫提供者的活動(dòng)連接(Live Connection),還可以通過Excute方法在數(shù)據(jù)源上執(zhí)行命令,而RecordSetPtr封裝了數(shù)據(jù)源提供者返回的記錄,它可以用于瀏覽返回的結(jié)果,也可以用于插入、刪除或修改以有記錄。為了代碼的安全性,必須在函數(shù)調(diào)用的地方添加“try…catch…”程序塊:
Try
{
m_pRs=m_pConn->Excute(a_pStoredProcString,NULL,adCmdStored Proc);
Return m_pRs;
}
Catch(_corn_errora_pComError)
{
TraceCOMExceptions(a_pComError);
Return NULL;
}
2) 使用Connection對象和數(shù)據(jù)庫建立連接
3) 利用建立好的連接(Connection)對象,通過Command對象執(zhí)行SQL命令,如果是從數(shù)據(jù)庫中讀出數(shù)據(jù),則將提取出的數(shù)據(jù)放入記錄集RecordSet對象。
4) 使用完畢后斷開和數(shù)據(jù)庫的連接,釋放對象。需要調(diào)用以下代碼釋放程序占用的COM資源。在VC工程應(yīng)用累的ExitInstance成員函數(shù)添加如下代碼,將初始化的對象釋放,清除為ADO對象準(zhǔn)備的COM環(huán)境
::Couninitialize
6 結(jié)束語
在VC++中包含了開發(fā)數(shù)據(jù)庫的全方位的支持,通過它所提供的訪問計(jì)數(shù)程序開發(fā)人員就可以訪問各種數(shù)據(jù)庫。本文概括了VC訪問數(shù)據(jù)庫的幾種技術(shù)特點(diǎn)及操作步驟。使程序開發(fā)人員和愛好者全面了解各種訪問技術(shù)特性,選擇適合自己的開發(fā)技術(shù)。
參考文獻(xiàn):
[1] 梁小亮,宋祖勛. Vc++6.0訪問Oracle數(shù)據(jù)庫技術(shù).微型電腦應(yīng)用 2008(24,6):63-65.
[2] 王櫻,徐雨明. Vc++中數(shù)據(jù)庫訪問技術(shù)研究.為計(jì)算機(jī)信息 2006(22,43):256-258.
[3] 譚鋒,蔡豐.基于ADO技術(shù)動(dòng)態(tài)創(chuàng)建SQL Server數(shù)據(jù)庫.計(jì)算機(jī)時(shí)代 2007(3):60-62.
[4] 王長江,屈紅剛,閔小剛.利用ADO實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入導(dǎo)出的關(guān)鍵技術(shù).重慶科技學(xué)院學(xué)報(bào)(自然科學(xué)版)2006.06(8,2):70-74.