ActiveX Data Objects (ADO)是用于訪問數(shù)據(jù)的基于自動(dòng)化的接口。ADO使用OLE DB接口訪問范圍廣大的數(shù)據(jù)源,包括但不限于通過ODBC提供的數(shù)據(jù)。
在這里我們不得不提到另一個(gè)對象RDS。Microsoft Remote Data Service (RDS)是ADO的一個(gè)組件,它為駐留在 Microsoft Internet Explorer上的應(yīng)用程序提供快速有效的數(shù)據(jù)連接和數(shù)據(jù)發(fā)布框架。它是一種基于工作在 HTTP、HTTPS(在 Secure Sockets 層上的HTTP)和DCOM應(yīng)用程序協(xié)議之上的客戶端/服務(wù)器的分布式技術(shù)。RDS 使用數(shù)據(jù)識別ActiveX控件,向需要建立分布式、數(shù)據(jù)密集且用于企業(yè)內(nèi)部網(wǎng)和Internet的應(yīng)用程序的Web開發(fā)人員提供以Microsoft Visual Basic樣式編程的數(shù)據(jù)訪問。
下面我們就在Visual C++6.0中利用ADO實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫編程的實(shí)際例子,以便讓大家對ADO有一個(gè)認(rèn)識。
1.首先建立應(yīng)用程序的框架并初始化運(yùn)行環(huán)境(前面提到過ADO是用于訪問數(shù)據(jù)的基于OLE DB接口訪問的數(shù)據(jù)源,所以要初始化OLE/COM庫環(huán)境)
利用Visual C++的MFC AppWizard(exe)創(chuàng)建一個(gè)標(biāo)準(zhǔn)的單文檔(Single Document)應(yīng)用程序(比如采用默認(rèn)設(shè)置)。
2.引入ADO的庫文件msado15.dll
我們在使用ADO之前必須在工程中引入ADO的庫文件msado15.dll。通常我們在文件“stdAfx.h”中將其導(dǎo)入;以便使編譯器能正確的編譯同時(shí)生成我們需要的.tli和.tlh文件。
需要導(dǎo)入的代碼如下:
?。nclude
?。mport "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF","EndofFile")
3. 利用智能指針(Smart Pointer)進(jìn)行數(shù)據(jù)庫操作
在CaboutDlg類的定義中定義兩個(gè)ADO的智能指針類實(shí)例(后面我們會(huì)比較詳細(xì)地介紹ADO中的智能指針),同時(shí)添加一個(gè)Listbox用以顯示我們從數(shù)據(jù)庫中獲得字段值。
class CaboutDlg : public Cdialog
{
public:
CaboutDlg(); //添加的代碼
_ConnectionPtr pConn;
_RecordsetPtr pRst;
ClistBox m_ListBox;
……
}
在ADO中的類庫中包含有這樣的三個(gè)智能指針,它們分別是: -ConnectionPtr,-RecordsetPtr,-CommandPtr。下面我們就針對這三個(gè)智能指針分別進(jìn)行介紹:
?。瑿onnectionPtr,用來管理連接一個(gè)數(shù)據(jù)源提供者所要求的信息,并可通過Open和Close的方法來打開一個(gè)到數(shù)據(jù)源提供者的活連接(即Live Connection)。另外還可以建立和管理事務(wù),如BeginTrans,CommitTrans和RollBackTrans。最后可以通過Excute這種方法在數(shù)據(jù)源上執(zhí)行命令;
?。璕ecordsetPtr,封裝數(shù)據(jù)源提供者返回的記錄集合。使用該類可以瀏覽返回的記錄,也可以插入一個(gè)新的記錄,或者更新和刪除一個(gè)已經(jīng)有的記錄;
-CommandPtr,封裝了一個(gè)要發(fā)送到數(shù)據(jù)庫的命令串(比如通常用的SQL查詢語句)。該命令可以是一個(gè)表的名字,或者一個(gè)存儲(chǔ)過程,或者一個(gè)依賴數(shù)據(jù)源的串。
4. 添加執(zhí)行代碼
利用ClassWizard在CaboutDlg類中映射ON_WM_INITDIALOG消息添加一個(gè)對話框的初始化函數(shù)OnInitDialog();在該函數(shù)中添加以下的代碼:
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//添加的代碼
_variant_t theValue;
m_ListCtrl=(CListBox *)GetDlgItem(IDC_LIST_BOX);
ASSERT(m_ListCtrl!=NULL);
m_ListCtrl->ResetContent();
pConn.CreateInstance(_uuidof(Connection));
pRst.CreateInstance(_uuidof(Recordset));
try
{
pConn→ConnectionString="DSN=Accounts";
//設(shè)置連接字符串,利用ODBC連接Accounts
數(shù)據(jù)庫
pConn→Open("","sa","",NULL); //打開連接
pRst→Open("select * from Checking-Account",(IDispatch*)pConn,adOpenDynamic,adLockOptimistic,adCmdText);//執(zhí)行一個(gè)SQL獲得希望得到的數(shù)據(jù)集
while (!pRst→EndofFile)
{
theValue=pRst→GetCollect("Owner_ID");
if (theValue.vt!=VT_NULL)
m_ListCtrl→AddString((char *)_bstr_t(theValue));
pRst→MoveNext();
}//遍歷記錄集,獲得字段Owner-ID的字段值,同時(shí)將其添加到ListBox中去
pRst→Close();//關(guān)閉記錄集pRst
pConn→Close(); //關(guān)閉連接pConn
}
catch(_com_error * e) //在這里對異常情況進(jìn)行處理
{
CString Error=e→ErrorMessage();
AfxMessageBox(e→ErrorMessage());
}
pRst=NULL;
pConn=NULL;
return TRUE;
}
在上述的代碼中我們使用了這樣一種數(shù)據(jù)類型:_variant_t ,它封裝了Visual C++中的VARIANT類型(在Visual Basic中我們可能已經(jīng)接觸的比較多了);還有一種數(shù)據(jù)類型就是_bstr_t(寬字符型);有關(guān)這兩種數(shù)據(jù)類型的詳細(xì)介紹請參見MSDN。
接下來編譯該工程,然后運(yùn)行。怎么樣,是不是覺得使用起來很方便?!