摘要:介紹了在VC6.0中利用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序的方法。
關(guān)鍵詞:ADO VC 教據(jù)庫
中圖分類號(hào):TIP311.13 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào):1002-2422(2008)01-0042-02
1 VC中應(yīng)用ADO接口編程
Connection,Command,Recordset是ADO對(duì)象模型中三個(gè)主體對(duì)象。可以被獨(dú)立地創(chuàng)建和釋放,而不需要訪問更高一層的數(shù)據(jù)對(duì)象。例如:ADO對(duì)象允許以打開的方式訪問一個(gè)Recordset對(duì)象而不必首先建立一個(gè)與數(shù)據(jù)源的連接,使得ADO模型比其他對(duì)象模型更簡單和更靈活。
1.1引入ADO庫文件,初始化COM庫
要使用ADO對(duì)象訪問數(shù)據(jù)庫,必須在工程的stdafx.h文件里用直接引入符號(hào)“#import”引入ADO。庫文件,以使編譯器能正確編譯。代碼如下所示:
#import“c:\program fdes\conunon fdes\system\ado\msado15.dll”no_namespace renBlne(“EOF”,“adoEOF”)
該語句聲明在工程中使用ADO,但不使用ADO的名字空間,并且為了避免常數(shù)沖突,將常數(shù)“EOF”改名“adoEOF”。這樣不需添加另外的頭文件,就可以使用ADO接口了。
應(yīng)用程序在調(diào)用ADO前,必須初始化COM庫環(huán)境。在MFC應(yīng)用程序里,一個(gè)比較好的方法是在應(yīng)用程序主類的InitInstance()成員函數(shù)里使用MxOleInit()來初始化COM庫環(huán)境。
1.2使用Connection對(duì)象連接數(shù)據(jù)庫
一般通過Connection對(duì)象的Open方法來連接數(shù)據(jù)庫,該方法的原型是:
HRESULT Conneetionl5::Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)
創(chuàng)建ADO的連接,首先要設(shè)置ADO連接對(duì)象的Con-nectionString屬性,該屬性提供所要連接的數(shù)據(jù)庫類型、數(shù)據(jù)所處服務(wù)器、要訪問的數(shù)據(jù)庫和數(shù)據(jù)庫訪問的安全認(rèn)證信息。UserID是用戶名,Password是登錄密碼,Options是連接選項(xiàng),用于指定Connection對(duì)象對(duì)數(shù)據(jù)的更新許可權(quán)。
常用的連接方式有以下幾種:
(1)通過JET數(shù)據(jù)庫引擎對(duì)ACCESS 2000數(shù)據(jù)庫的連接:
m_pConnection->Open(“Provider=Microsoft.jet.OLEDB.4.0;Data Source=D:\TEST\testinfo.mdb”,“,”,adModeUnknown);
(2)通過DSN數(shù)據(jù)源對(duì)任何支持ODBC的數(shù)據(jù)庫進(jìn)行連接:
m_pConnection->Open(“Data Soume=adotest;UID=sa;PWD=;”,“”,“”,adModeUnknown);
(3)不通過DSN對(duì)SQL SERVER數(shù)據(jù)庫進(jìn)行連接:m_pConnecfion->Open(“driver=(SQL Server};Server=127.0.0.1;DATABASE=testinfo;U1D=sa;PWD=139”,“,”,adModeUnknown):
其中Server是SQL服務(wù)器的名稱,DATABASE是庫的名稱。下面的一段代碼演示了如何創(chuàng)建Connection對(duì)象實(shí)例及如何連接數(shù)據(jù)庫并進(jìn)行異常捕捉。
_ConnectionPtr m_pConnection;
HRESULT hr;
Try{
hr=m_pConnection.Createlnstance(“ADODB.Connecfion”);if(SUCCEEDED(hr))
{
hr=m_pConnection->Open(“Provider=Microsdt.Jet.OLEDB.4.0;Data Soume=tesfinfo.mdb”,“”,“”,adModeUnknown);
}
}
catch(_corn_error e)
{
CString errormessage;
errormessage.Format(“數(shù)據(jù)庫連接失敗!\r\n錯(cuò)誤信息:%8”,e.Er-mrMessage());
AfxMessageBox(erromaessage);
}
1.3查詢、處理數(shù)據(jù),取得結(jié)果記錄集
為了取得結(jié)果記錄集,需要定義一個(gè)指向Recordset對(duì)象的指針:_RecordsetPtr m_pRecordset;并為其創(chuàng)建Record-set對(duì)象的實(shí)例:
m_pRecondset.CreateInstance(“ADODB.Recordset”);
查詢、處理數(shù)據(jù),需要用到SQL命令,SQL命令的執(zhí)行可以采用下面三種形式。
(1)用Connection對(duì)象的Execute方法執(zhí)行SQL命令。Execute方法的原型如下所示;
_Recordsetptr Connection 15::Execute(_bstr_t CommandText,VARI-ANT*RecordsA.fected,long options)
(2)利用Command對(duì)象來執(zhí)行SQL命令,也可以利用Command對(duì)象執(zhí)行SQL語句,并取得結(jié)果記錄集,舉例如下:
_CommandPtr m_pCommand;
m_pCommand.Createlnstance(“ADODB.Command”);
_variant_t vNULL;
VNULL.vt=VT_ERROR;
vNULL.scode=DISP_E_PARAMNOTFOUND;
m_pCommand->ActiveConnection=m_pConnection;
m_pCommand->CommandText=“SELECT*FROM test”;
m_pReeondset=m_pCommand->Execute(vNUIL,vNUIL,adCmd-Text);
(3)直接用Recordset對(duì)象進(jìn)行查詢?nèi)〉糜涗浖蚏-ecordset對(duì)象提供了豐富的控制功能,如記錄鎖定,游標(biāo)控制等。下面的語句為表格查詢:
m_pReeordset->Open (“SETLECT*FROM test”,_variant_t((IDispatch *)n_pConnection,true),dOpenStatic,adLockOptimistic。adCmdText);
1.4使用完畢后,關(guān)閉連接,釋放對(duì)象
m_pRecordset->Close();
m_pRecordset->Release();
m_pConnection->Cbse();
m_pCormection->Release();
2 關(guān)于數(shù)據(jù)類型轉(zhuǎn)換
COM對(duì)象是跨平臺(tái)的,使用了一種通用的方法來處理各種類型的數(shù)據(jù),因此CString類和COM對(duì)象是不兼容的,需要一組API來轉(zhuǎn)換COM對(duì)象和C++類型的數(shù)據(jù)。_va-tiant_t和_bstr_t就是這樣兩種對(duì)象。提供了通用的方法轉(zhuǎn)換COM對(duì)象和C++類型的數(shù)據(jù)。實(shí)際項(xiàng)目的開發(fā)過程中需要存儲(chǔ)較大的二進(jìn)制數(shù)據(jù)對(duì)象BLOB(Binary Large Ob-ject),如:圖像文件、音頻文件或其它二進(jìn)制數(shù)據(jù)。其存取的方式與普通數(shù)據(jù)有所區(qū)別。
BLOB數(shù)據(jù)的保存需要使用AppendChunk函數(shù),Ap-pendChnnk包含在Field對(duì)象中,原型為:HRESULT Aw-pendChunk(const_varianuData)。從函數(shù)原型中可以看到關(guān)鍵的問題是需把二進(jìn)制數(shù)據(jù)賦值給VARIANT類型的變量。讀取BLOB數(shù)據(jù)應(yīng)該使用GetChnnk()函數(shù),其原型_為:varianu GetChnnk(long Length);給出數(shù)據(jù)的長度后GetChunk將返回包含數(shù)據(jù)的VARIANT類型變量,然后可以利用SafeArrayAcccssData函數(shù)得到VARIANT變量中指向數(shù)據(jù)的char*類型的指針,方便用戶的處理。
3 結(jié)束語
ADO的對(duì)象層次模型封裝了數(shù)據(jù)庫訪問細(xì)節(jié),為C++程序員提供了一種非常好的數(shù)據(jù)訪問策略。使程序員從具體的DBMS中解脫出來,從而極大的減少了軟件開發(fā)的工作量,縮短開發(fā)周期,提高了效率和軟件的可靠性。