ADO三个基本接口
- 格式:docx
- 大小:34.35 KB
- 文档页数:18
ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口Connection、Recordset和Command,分别表示连接对象、记录集对象和命令对象。
三个对象对应的智能指针分别是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。
ADO使用_ConnectionPtr这个指针来操纵Connection对象,类似地,后面用到的_CommandPtr和_RecordsetPtr分别表示命令对象指针和记录集对象指针。
参考:svn中文网_ConnectionPtr接口返回一个记录集或一个空指针。
通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。
使用 _ConnectionPtr接口返回一个记录集不是一个好的使用方法。
对于要返回记录的操作通常用_RecordserPtr来实现。
而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
_CommandPtr接口返回一个记录集。
它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。
在使用_CommandPtr接口时,你可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。
如果你只执行一次或几次数据访问操作,后者是比较好的选择。
但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr 接口执行存储过程和SQL语句。
_RecordsetPtr是一个记录集对象。
与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。
同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。
如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。
1._ConnectionPtr接口_ConnectionPtr m_pConnection;///声明数据库连接变量Connection对象最常用的Open方法和Execute方法。
pen方法用于打开一个库连接,而Execute方法一般用于执行一条SQL语句。
先定义一个Connection类型的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open函数建立与数据源的连接。
在建立连接对象后,可以使用连接对象的Execute()函数来执行SQL命令。
m_pConnection.CreateInstance(__uuidof(Connection));m_pConnection->Open("Provider=Microsoft.ACE.OLEDB.12.0;DataSource=e:\\test.mdb;Persist Security Info=False;","","",adModeUnknown);(1)_ConnectionPtr智能指针Open方法的原型:Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)ConnectionString为连接字串,UserID是用户名,Password是登陆密码Options是连接选项,可以是如下几个常量:adModeUnknown 缺省,当前的许可权未设置adModeRead 只读adModeWrite 只写adModeReadWrite 可以读写adModeShareDenyRead 阻止其它Connection对象以读权限打开连接adModeShareDenyWrite 阻止其它Connection对象以写权限打开连接adModeShareExclusive 阻止其它Connection对象打开连接adModeShareDenyNone 阻止其它程序或对象以任何权限建立连接(2)_ConnectionPtr智能指针Open方法的原型:_RecordsetPtr Connection15::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)其中CommandText是命令字串,通常是SQL命令,参数RecordsAffected是操作完成后所影响的行数参数Options表示CommandText中内容的类型,可以取下列值之一:adCmdText 表明CommandText是文本命令adCmdTable 表明CommandText是一个表名adCmdProc 表明CommandText是一个存储过程adCmdUnknown 未知Execute执行完后返回一个指向记录集的指针。
#include <iostream.h>#import "C:\Program Files\Common Files\system\ado\msado15.dll" rename("EOF","adoEOF")//插入数据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;DataSource=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();}//更新数据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;DataSource=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();}//根据条件查询数据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;DataSource=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,CityFROM 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;}2._CommandPtr接口_CommandPtr接口返回一个记录集或一个空指针。