ADO接口
转自百度文库
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();
- }
- }
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();
- }
- }
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;
- }
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语句进行其它有关数据库的访问和操作。
ADO接口的更多相关文章
- ADO接口简介
源地址:http://blog.csdn.net/xiaobai1593/article/details/7449151 参考: 1. 百度文库:http://wenku.baidu.com/view ...
- ADO接口之_RecordsetPtr
转自:http://hi.baidu.com/%CE%D2%B6%CF%C1%CB%CB%BC%C4%EE/blog/item/e057c526c6af6c29c995596e.html _Recor ...
- 第三次上机,ADO接口的使用
<html> <head> <title>Reg</title> </head> <body><center> &l ...
- VC++ ADO相关
<VC对ADO的操作> ADO概述: ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口. ADO 使您能够编写应用程序以通过 ...
- 读书笔记——数据库的ADO开发总结
基本上是对 ADO+开发指南.pdf 的摘抄和总结,以及个人心得. 文章末尾有<ADO+开发指南.pdf>的资源下载,附带个人批注. --------------------------- ...
- VC操作ADO的基本策略
一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据 ...
- _ConnectionPtr.CreateInstance(__uuidof(Connection))“不支持此接口”错误解决
最近在换了win7 64位的系统,今天突然发现以前写的ADO连接数据库的代码编译后在windows2003下会执行到: _ConnectionPtr.CreateInstance(__uuidof(C ...
- 用ADO操作数据库的方法步骤(ZT)
http://www.cppblog.com/changshoumeng/articles/113437.html 学习ADO时总结的一些经验 用ADO操作数据库的方法步骤 ADO接口简介 ADO库包 ...
- Visual C++中的ADO编程
摘 要:本文介绍了微软推出的以ActiveX技术为基础的ADO数据存取技术,分析了ADO的工作原理,并用Visual C++说明了ADO数据访问技术的实现方法. 关键字:ADO:连接对象:OLE D ...
随机推荐
- Windows Azure 网站:应用程序字符串和连接字符串的工作原理
编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站上有一个方便的功能,即开发人员可将 Azure 中的 ...
- 如何在IE8下调试OCX控件
第一种方式 多进程模式下, 在IE8打开web页面, 然后在调试菜单选择附加到进程, 这时看到2个IE进程, 选择没有带标题的, 也就是主进程, 就可以正常调试了. 此方式比较麻烦, 不能F5直接启动 ...
- How many ways(记忆化搜索)
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 整合Spring.net到asp.net网站开发中初探
整合Spring.net到asp.net网站开发中初探 http://www.veryhuo.com 2009-10-21 烈火网 投递稿件 我有话说 Spring提供了一个轻量级的用于构建企业级 ...
- oracle默认的hr用户使用脚本安装
1 解压到%ORACLE_HOME%/demo/schema/human_resources/目录下 2 在sys或system用户下运行hr_main.sql脚本(运行命令:@%ORACLE_HOM ...
- 解决Collection <__NSArrayM: 0x7f8168f7a750> was mutated while being enumerated.'
当程序出现这个提示的时候,是因为你一边便利数组,又同时修改这个数组里面的内容,导致崩溃,网上的方法如下: NSMutableArray * arrayTemp = xxx; NSArray * arr ...
- Unity5UGUI 官方教程学习笔记(一)Canvas
Canvas Canvas是控制一组UI元素将被渲染 所有的UI元素必须是Canvas下的子物体 一个场景中可以拥有多个Canvas 在创建UI元素时,如果没有Canvas,将会自动创建Canvas ...
- 用原生JS写移动动画案例及实际应用
js很强大 相信很多人都知道,那么它有哪些强大之处呢?有兴趣的人可以去查查,这里就不赘述了,因为不在本片文章讨论的范围. 我们要讲的是怎么用原生JS写移动动画?我们先举一个最简单的动画例子,很多网站的 ...
- 使用#define定义字面值和伪函数
#define是C语言提供的宏命令,其主要目的是:在编程时,为程序员提供一定方便,并能在一定程度上提高程序的执行效率.#define将一个标示符定义为一个字符串,该标示符被称为宏,被定义的字符串称为字 ...
- BZOJ 1951: [Sdoi2010]古代猪文( 数论 )
显然答案是G^∑C(d,N)(d|N).O(N^0.5)枚举N的约数.取模的数999911659是质数, 考虑欧拉定理a^phi(p)=1(mod p)(a与p互质), 那么a^t mod p = a ...