ADO中最重要的對象有三個:Connection、Recordset和Command,分別表示連接對象、記錄集對象和命令對象。
三個對象對應的智能指針分別是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。
ADO使用_ConnectionPtr這個指針來操縱Connection對象,類似地,後面用到的_CommandPtr和_RecordsetPtr分別表示命令對象指針和記錄集對象指針。
Connection對象是這三個對象的基礎,它的主要作用是建立與數據庫的連接,建立了與數據庫的連接後,才能進行其它有關數據庫的訪問和操作。也就是說,使用ADO操作數據庫,通常先用Connection對象的Open方法打開一個庫連接,然後才能進行數據庫的操作。操作完成後,要關閉這個庫連接。
本文只講述Connection對象最常用的Open方法和Execute方法。
注意:在使用ADO進行操作之前,必須使用AfxOleInit()函數來進行初始化;
1. Open()方法
用於打開一個庫連接,而Execute()方法一般用於執行一條SQL語句。
_ConnectionPtr智能指針的用法:
首先定義一個Connection類型的指針,然後調用CreateInstance()來創建一個連接對象的實例,再調用Open()函數建立與數據源的連接。
在建立連接對象後,可以使用連接對象的Execute()函數來執行SQL命令。
_ConnectionPtr智能指針Open()方法的原型:
Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)
ConnectionString爲連接字串,UserID是用戶名,Password是登陸密碼
Options是連接選項,可以是如下幾個常量:
1> adModeUnknown 缺省,當前的許可權未設置
2> adModeRead 只讀
3> adModeWrite 只寫
4> adModeReadWrite 可以讀寫
5> adModeShareDenyRead 阻止其它Connection對象以讀權限打開連接
6> adModeShareDenyWrite 阻止其它Connection對象以寫權限打開連接
7> adModeShareExclusive 阻止其它Connection對象打開連接
8> adModeShareDenyNone 阻止其它程序或對象以任何權限建立連接
2. Execute方法
函數原型:
_RecordsetPtr Connection::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)
參數:
CommandText是命令字串,通常是SQL命令,
RecordsAffected是操作完成後所影響的行數
Options表示CommandText中內容的類型,可以取下列值之一:
1> adCmdText 表明CommandText是文本命令
2>adCmdTable 表明CommandText是一個表名
3>adCmdProc 表明CommandText是一個存儲過程
4>adCmdUnknown 未知
Execute執行完後返回一個指向記錄集的指針(_ResultsetPtr類型)
3. 異常捕獲
出現的異常爲:_com_error
例程CREATE_DB_AND_TABLE中已經使用了_ConnectionPtr指針的Open方法和Execute方法,在後面的例程我們將進一步詳細說明。
例程
ConnPtr_Open_Exe
打開VC++ 6.0,新建一個基於對話框的工程ConnPtr_Open_Exe。在對話框IDD_CONNPTR_OPEN_EXE_DIALOG中進行編輯:
使用三個Group Box分成三個部分,第一部分演示使用Execute()函數來執行INSERT INTO命令;第二部分演示使用Execute()函數來執行Update命令;第三部分演示使用Execute()函數來執行SELECT命令。其中,第一部分和第二部分不需要返回記錄集,第三部分演示返回記錄集顯示結果。
該對話框幾個控件如下:
控件名稱 ID 用途
按鈕 IDC_BTN_INSERT_INTO 執行INSERT INTO語句
按鈕 IDC_BTN_UPDATE 執行Update語句
按鈕 IDC_BTN_SELECT 執行SELECT語句
列表框 IDC_LIST1 顯示SELECT語句執行結果
使用ClassWizard給列表框IDC_LIST1創建CListBox變量m_list1:
雙擊IDC_BTN_INSERT_INTO按鈕,並編輯OnBtnInsertInto()函數如下:
- void CConnPtr_Open_ExeDlg::OnBtnInsertInto()
- {
- _ConnectionPtr m_pConnection;
- _variant_t RecordsAffected;
- try
- {
- m_pConnection.CreateInstance(__uuidof(Connection));
- m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
- }
- catch(_com_error e)
- {
- CString errormessage;
- errormessage.Format("連接數據庫失敗!\r錯誤信息:%s",e.ErrorMessage());
- AfxMessageBox(errormessage);
- return;
- }
- try
- {
- _bstr_t strCmd="INSERT INTO Employees(EmployeeID,FirstName,LastName,HireDate,City,Country) VALUES(10,'Mary','Williams','15/4/1993 12:00:00','New York','USA')";
- m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
- }
- catch(_com_error &e)
- {
- AfxMessageBox(e.Description());
- }
- if(m_pConnection->State)
- {
- m_pConnection->Close();
- }
- }
雙擊IDC_BTN_UPDATE按鈕,並編輯OnBtnUpdate()函數如下:
- void CConnPtr_Open_ExeDlg::OnBtnUpdate()
- {
- _ConnectionPtr m_pConnection;
- _variant_t RecordsAffected;
- try
- {
- m_pConnection.CreateInstance(__uuidof(Connection));
- m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
- }
- catch(_com_error e)
- {
- CString errormessage;
- errormessage.Format("連接數據庫失敗!\r錯誤信息:%s",e.ErrorMessage());
- AfxMessageBox(errormessage);
- return;
- }
- try
- {
- _bstr_t strCmd="UPDATE Employees SET FirstName='Bill',LastName='Clinton',HireDate='25/11/1994 12:00:00',City='Los Angeles' WHERE EmployeeID=10";
- m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
- }
- catch(_com_error &e)
- {
- AfxMessageBox(e.Description());
- }
- if(m_pConnection->State)
- {
- m_pConnection->Close();
- }
- }
雙擊IDC_BTN_SELECT按鈕,並編輯OnBtnSelect()函數如下:
- void CConnPtr_Open_ExeDlg::OnBtnSelect()
- {
- _ConnectionPtr m_pConnection;
- _variant_t RecordsAffected;
- _RecordsetPtr m_pRecordset;
- try
- {
- m_pConnection.CreateInstance(__uuidof(Connection));
- m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
- }
- catch(_com_error e)
- {
- CString errormessage;
- errormessage.Format("連接數據庫失敗!\r錯誤信息:%s",e.ErrorMessage());
- AfxMessageBox(errormessage);
- return;
- }
- try
- {
- m_pRecordset.CreateInstance("ADODB.Recordset"); //爲Recordset對象創建實例
- _bstr_t strCmd="SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'";
- m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
- }
- catch(_com_error &e)
- {
- AfxMessageBox(e.Description());
- }
- _variant_t vEmployeeID,vFirstName,vLastName,vHireDate,vCity;
- try
- {
- while(!m_pRecordset->adoEOF)
- {
- vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));
- //取得第1列的值,從0開始計數,你也可以直接列出列的名稱,如下一行
- vFirstName=m_pRecordset->GetCollect("FirstName");
- vLastName=m_pRecordset->GetCollect("LastName");
- vHireDate=m_pRecordset->GetCollect("HireDate");
- vCity=m_pRecordset->GetCollect("City");
- CString strtemp;
- if(vEmployeeID.vt!=VT_NULL)
- {
- strtemp.Format("%d",vEmployeeID.lVal);
- }
- if(vFirstName.vt!=VT_NULL)
- {
- strtemp+=" ";
- strtemp+=(LPCTSTR)(_bstr_t)vFirstName;
- }
- if(vLastName.vt!=VT_NULL)
- {
- strtemp+=" ";
- strtemp+=(LPCTSTR)(_bstr_t)vLastName;
- }
- if(vHireDate.vt!=VT_NULL)
- {
- strtemp+=" ";
- strtemp+=(LPCTSTR)(_bstr_t)vHireDate;
- }
- if(vCity.vt!=VT_NULL)
- {
- strtemp+=" ";
- strtemp+=(LPCTSTR)(_bstr_t)vCity;
- }
- m_list1.AddString(strtemp);
- m_list1.AddString("\n");
- //移動到下一條記錄
- m_pRecordset->MoveNext();
- }
- }
- catch(_com_error &e)
- {
- AfxMessageBox(e.Description());
- }
- m_pRecordset->Close();
- m_pRecordset=NULL;
- m_pConnection->Close();
- m_pConnection=NULL;
- }
附加操作(重要):
1> 在stdafx.h中加入如下語句:
#import "C:\Program Files\Common Files\system\ado\msado15.dll" rename("EOF","adoEOF")
2> 在BOOL CConnPtr_Open_ExeApp::InitInstance()函數中加入:
AfxOleInit();
該部分演示瞭如何使用_ConnectionPtr接口開發ACCESS數據庫:先創建一個Connection對象實例,然後用Open方法打開一個庫連接,最後使用Execute方法執行SQL語句進行其它有關數據庫的訪問和操作。