转自百度文库
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语句进行其它有关数据库的访问和操作。