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數據庫,您也可以直接在我們提供的示例代碼中找到這個test.mdb。
下面我們將詳細介紹上述步驟並給出相關代碼。
【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={SQLServer};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139 ", " ", " ",adModeUnknown);
其中Server是SQL服務器的名稱,DATABASE是庫的名稱
Connection對象除Open方法外還有許多方法,我們先介紹Connection對象中兩個有用的屬性ConnectionTimeOut與State
ConnectionTimeOut用來設置連接的超時時間,需要在Open之前調用,例如:
m_pConnection-> ConnectionTimeout = 5;///設置超時時間爲5秒
m_pConnection-> Open( "Data Source=adotest; ", " ", " ",adModeUnknown);
State屬性指明當前Connection對象的狀態,0表示關閉,1表示已經打開,我們可以通過讀取這個屬性來作相應的處理,例如:
if(m_pConnection-> State) m_pConnection-> Close(); ///如果已經打開了連接則關閉它