天天看點

VC++ ADO資料存取(一)

轉載請注明出處——(作者:王晖)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();

}