转自百度文库

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()函数如下:

  1. void CConnPtr_Open_ExeDlg::OnBtnInsertInto()
  2. {
  3. _ConnectionPtr m_pConnection;
  4. _variant_t RecordsAffected;
  5. try
  6. {
  7. m_pConnection.CreateInstance(__uuidof(Connection));
  8. m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
  9. }
  10. catch(_com_error e)
  11. {
  12. CString errormessage;
  13. errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
  14. AfxMessageBox(errormessage);
  15. return;
  16. }
  17. try
  18. {
  19. _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')";
  20. m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
  21. }
  22. catch(_com_error &e)
  23. {
  24. AfxMessageBox(e.Description());
  25. }
  26. if(m_pConnection->State)
  27. {
  28. m_pConnection->Close();
  29. }
  30. }
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()函数如下:

  1. void CConnPtr_Open_ExeDlg::OnBtnUpdate()
  2. {
  3. _ConnectionPtr m_pConnection;
  4. _variant_t RecordsAffected;
  5. try
  6. {
  7. m_pConnection.CreateInstance(__uuidof(Connection));
  8. m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
  9. }
  10. catch(_com_error e)
  11. {
  12. CString errormessage;
  13. errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
  14. AfxMessageBox(errormessage);
  15. return;
  16. }
  17. try
  18. {
  19. _bstr_t strCmd="UPDATE Employees SET FirstName='Bill',LastName='Clinton',HireDate='25/11/1994 12:00:00',City='Los Angeles' WHERE EmployeeID=10";
  20. m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
  21. }
  22. catch(_com_error &e)
  23. {
  24. AfxMessageBox(e.Description());
  25. }
  26. if(m_pConnection->State)
  27. {
  28. m_pConnection->Close();
  29. }
  30. }
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()函数如下:

  1. void CConnPtr_Open_ExeDlg::OnBtnSelect()
  2. {
  3. _ConnectionPtr m_pConnection;
  4. _variant_t RecordsAffected;
  5. _RecordsetPtr m_pRecordset;
  6. try
  7. {
  8. m_pConnection.CreateInstance(__uuidof(Connection));
  9. m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
  10. }
  11. catch(_com_error e)
  12. {
  13. CString errormessage;
  14. errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
  15. AfxMessageBox(errormessage);
  16. return;
  17. }
  18. try
  19. {
  20. m_pRecordset.CreateInstance("ADODB.Recordset"); //为Recordset对象创建实例
  21. _bstr_t strCmd="SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'";
  22. m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
  23. }
  24. catch(_com_error &e)
  25. {
  26. AfxMessageBox(e.Description());
  27. }
  28. _variant_t vEmployeeID,vFirstName,vLastName,vHireDate,vCity;
  29. try
  30. {
  31. while(!m_pRecordset->adoEOF)
  32. {
  33. vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));
  34. //取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行
  35. vFirstName=m_pRecordset->GetCollect("FirstName");
  36. vLastName=m_pRecordset->GetCollect("LastName");
  37. vHireDate=m_pRecordset->GetCollect("HireDate");
  38. vCity=m_pRecordset->GetCollect("City");
  39. CString strtemp;
  40. if(vEmployeeID.vt!=VT_NULL)
  41. {
  42. strtemp.Format("%d",vEmployeeID.lVal);
  43. }
  44. if(vFirstName.vt!=VT_NULL)
  45. {
  46. strtemp+=" ";
  47. strtemp+=(LPCTSTR)(_bstr_t)vFirstName;
  48. }
  49. if(vLastName.vt!=VT_NULL)
  50. {
  51. strtemp+=" ";
  52. strtemp+=(LPCTSTR)(_bstr_t)vLastName;
  53. }
  54. if(vHireDate.vt!=VT_NULL)
  55. {
  56. strtemp+=" ";
  57. strtemp+=(LPCTSTR)(_bstr_t)vHireDate;
  58. }
  59. if(vCity.vt!=VT_NULL)
  60. {
  61. strtemp+=" ";
  62. strtemp+=(LPCTSTR)(_bstr_t)vCity;
  63. }
  64. m_list1.AddString(strtemp);
  65. m_list1.AddString("\n");
  66. //移动到下一条记录
  67. m_pRecordset->MoveNext();
  68. }
  69. }
  70. catch(_com_error &e)
  71. {
  72. AfxMessageBox(e.Description());
  73. }
  74. m_pRecordset->Close();
  75. m_pRecordset=NULL;
  76. m_pConnection->Close();
  77. m_pConnection=NULL;
  78. }
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接口的更多相关文章

  1. ADO接口简介

    源地址:http://blog.csdn.net/xiaobai1593/article/details/7449151 参考: 1. 百度文库:http://wenku.baidu.com/view ...

  2. ADO接口之_RecordsetPtr

    转自:http://hi.baidu.com/%CE%D2%B6%CF%C1%CB%CB%BC%C4%EE/blog/item/e057c526c6af6c29c995596e.html _Recor ...

  3. 第三次上机,ADO接口的使用

    <html> <head> <title>Reg</title> </head> <body><center> &l ...

  4. VC++ ADO相关

    <VC对ADO的操作> ADO概述: ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口. ADO 使您能够编写应用程序以通过 ...

  5. 读书笔记——数据库的ADO开发总结

    基本上是对 ADO+开发指南.pdf 的摘抄和总结,以及个人心得. 文章末尾有<ADO+开发指南.pdf>的资源下载,附带个人批注. --------------------------- ...

  6. VC操作ADO的基本策略

    一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据 ...

  7. _ConnectionPtr.CreateInstance(__uuidof(Connection))“不支持此接口”错误解决

    最近在换了win7 64位的系统,今天突然发现以前写的ADO连接数据库的代码编译后在windows2003下会执行到: _ConnectionPtr.CreateInstance(__uuidof(C ...

  8. 用ADO操作数据库的方法步骤(ZT)

    http://www.cppblog.com/changshoumeng/articles/113437.html 学习ADO时总结的一些经验 用ADO操作数据库的方法步骤 ADO接口简介 ADO库包 ...

  9. Visual C++中的ADO编程

    摘  要:本文介绍了微软推出的以ActiveX技术为基础的ADO数据存取技术,分析了ADO的工作原理,并用Visual C++说明了ADO数据访问技术的实现方法. 关键字:ADO:连接对象:OLE D ...

随机推荐

  1. Windows Azure 网站:应用程序字符串和连接字符串的工作原理

    编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站上有一个方便的功能,即开发人员可将 Azure 中的 ...

  2. 如何在IE8下调试OCX控件

    第一种方式 多进程模式下, 在IE8打开web页面, 然后在调试菜单选择附加到进程, 这时看到2个IE进程, 选择没有带标题的, 也就是主进程, 就可以正常调试了. 此方式比较麻烦, 不能F5直接启动 ...

  3. How many ways(记忆化搜索)

    How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. 整合Spring.net到asp.net网站开发中初探

    整合Spring.net到asp.net网站开发中初探 http://www.veryhuo.com 2009-10-21 烈火网 投递稿件 我有话说   Spring提供了一个轻量级的用于构建企业级 ...

  5. oracle默认的hr用户使用脚本安装

    1 解压到%ORACLE_HOME%/demo/schema/human_resources/目录下 2 在sys或system用户下运行hr_main.sql脚本(运行命令:@%ORACLE_HOM ...

  6. 解决Collection <__NSArrayM: 0x7f8168f7a750> was mutated while being enumerated.'

    当程序出现这个提示的时候,是因为你一边便利数组,又同时修改这个数组里面的内容,导致崩溃,网上的方法如下: NSMutableArray * arrayTemp = xxx; NSArray * arr ...

  7. Unity5UGUI 官方教程学习笔记(一)Canvas

    Canvas Canvas是控制一组UI元素将被渲染 所有的UI元素必须是Canvas下的子物体 一个场景中可以拥有多个Canvas 在创建UI元素时,如果没有Canvas,将会自动创建Canvas ...

  8. 用原生JS写移动动画案例及实际应用

    js很强大 相信很多人都知道,那么它有哪些强大之处呢?有兴趣的人可以去查查,这里就不赘述了,因为不在本片文章讨论的范围. 我们要讲的是怎么用原生JS写移动动画?我们先举一个最简单的动画例子,很多网站的 ...

  9. 使用#define定义字面值和伪函数

    #define是C语言提供的宏命令,其主要目的是:在编程时,为程序员提供一定方便,并能在一定程度上提高程序的执行效率.#define将一个标示符定义为一个字符串,该标示符被称为宏,被定义的字符串称为字 ...

  10. 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 ...