轉載請注明出處——(作者:王晖)http://blog.csdn.net/wangminjing/archive/2008/09/14/2927632.aspx
一、ADO簡介
ADO(ActiveX Data Object)是Microsoft資料庫應用程式開發的新接口,是建立在OLE DB之上的高層資料庫通路技術,請不必為此擔心,即使你對OLE DB,COM不了解也能輕松對付ADO,因為它非常簡單易用,甚至比你以往所接觸的ODBC API、DAO、RDO都要容易使用,并不失靈活性。本文将詳細地介紹在VC下如何使用ADO來進行資料庫應用程式開發,并給出示例代碼。
二、基本流程
ADO資料庫開發的基本流程:
(1)初始化COM庫,引入ADO庫定義檔案
(2)用Connection對象連接配接資料庫
(3)利用建立好的連接配接,通過Connection、Command對象執行SQL指令,或利用Recordset對象取得結果記錄集進行查詢、處理。
(4)使用完畢後關閉連接配接釋放對象。
本文采用Access資料庫
【1】COM庫的初始化
我們可以使用AfxOleInit()來初始化COM庫,這項工作通常在CWinApp::InitInstance()的重載函數中完成,請看如下代碼:
BOOL CADOTest1App::InitInstance()
{
AfxOleInit();
......
【2】用#import指令引入ADO類型庫
我們在stdafx.h中加入如下語句:(stdafx.h這個檔案哪裡可以找到?你可以在FileView中的Header Files裡找到)
#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
這一語句有何作用呢?其最終作用同我們熟悉的#include類似,編譯的時候系統會為我們生成msado15.tlh,ado15.tli兩個C++頭檔案來定義ADO庫。
幾點說明:
(1) 您的環境中msado15.dll不一定在這個目錄下,請按實際情況修改
(2) 在編譯的時候肯能會出現如下警告,對此微軟在MSDN中作了說明,并建議我們不要理會這個警告。
msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
【3】建立Connection對象并連接配接資料庫
首先我們需要添加一個指向Connection對象的指針:
_ConnectionPtr m_pConnection;
下面的代碼示範了如何建立Connection對象執行個體及如何連接配接資料庫并進行異常捕捉。
BOOL CADOTest1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///建立Connection對象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///連接配接資料庫
///上面一句中連接配接字串中的Provider是針對ACCESS2000環境的,對于ACCESS97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51; }
}
catch(_com_error e)///捕捉異常
{
CString errormessage;
errormessage.Format("連接配接資料庫失敗!/r/n錯誤資訊:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///顯示錯誤資訊
}
在這段代碼中我們是通過Connection對象的Open方法來進行連接配接資料庫的,下面是該方法的原型
HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )
ConnectionString為連接配接字串,UserID是使用者名, Password是登陸密碼,Options是連接配接選項,用于指定Connection對象對資料的更新許可權,
Options可以是如下幾個常量:
adModeUnknown:預設。目前的許可權未設定
adModeRead:隻讀
adModeWrite:隻寫
adModeReadWrite:可以讀寫
adModeShareDenyRead:阻止其它Connection對象以讀權限打開連接配接
adModeShareDenyWrite:阻止其它Connection對象以寫權限打開連接配接
adModeShareExclusive:阻止其它Connection對象打開連接配接
adModeShareDenyNone:允許其它程式或對象以任何權限建立連接配接
一些常用的連接配接方式供大家參考:
(1)通過JET資料庫引擎對ACCESS2000資料庫的連接配接
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C://test.mdb","","",adModeUnknown);
(2)通過DSN資料源對任何支援ODBC的資料庫進行連接配接:
m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnknown);
(3)不通過DSN對SQL SERVER資料庫進行連接配接: m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);
其中Server是SQL伺服器的名稱,DATABASE是庫的名稱
//-----------------------------------------------------------------------
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
//連接配接資料庫
void CMyDlg::LianJie()
{
// 初始化 COM 對象
::CoInitialize(NULL);
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");//建立Connection對象
if(SUCCEEDED(hr))
{
//連接配接資料庫
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=xfglxt.mdb","","",adModeUnknown);
//上面一句中連接配接字串中的Provider是針對ACCESS2000環境的,
//對于ACCESS97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51;
// AfxMessageBox("成功連接配接資料庫");
}
}
catch(_com_error e)//捕捉異常
{
CString errormessage;
errormessage.Format("打開資料庫失敗!/r/n錯誤資訊:%s",e.ErrorMessage());
AfxMessageBox(errormessage);//顯示錯誤資訊
this->EndDialog(0);
}
}
//斷開資料庫
void CMyDlg::TuiChu()
{
if(m_pConnection->GetState()==adStateOpen)
{
m_pConnection->Close();///關閉連接配接
m_pRecordset->Close();///關閉記錄集
}
m_pConnection.Release();
::CoUninitialize();
}