转自百度文库

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 8 Store App】学习二:ResourceLoader

    原文 http://www.cnblogs.com/java-koma/archive/2013/05/22/3093308.html 在项目开发时,通常有一些资源信息需要存储起来,比如请求的URL, ...

  2. [原]基于CAS实现单点登录(SSO):cas client端的退出问题

    自从CAS 3.4就很好的支持了单点注销功能,配置也很简单. 之前版本因为在CAS服务器通过HttpClient发送消息时并未指定为POST方式,所以在CAS客户端的注销Filter中没有收到POST ...

  3. 一个大小为N的数组,里面是N个整数,怎样去除重复的数

    题目:一个大小为N的数组,里面是N个整数,怎样去除重复的数字: 要求时间复杂度为O(n),空间复杂度为O(1). 需要除掉重复的整数的数组,注意这里我没有处理负数情况,其实负数情况只要先用0快排分一下 ...

  4. android在桌面弹出一个窗口

    android在桌面弹出一个窗口 遇到了这种需求,要和iPhone一样的效果. 下面是简单实现功能,优化和美化部分,有时间慢慢搞. 方法应该有不少吧,我用的是弹出一个activity,将这个activ ...

  5. Java程序员快速入门Go语言

    这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...

  6. springMVC+spring+mybatis整合过程中遇到的问题

    今天在配置SSM整合的过程中遇到了几个错误,折腾了好久,具体如下 1.java.lang.IllegalArgumentException: Mapped Statements collection ...

  7. Spring AOP AspectJ Pointcut 表达式例子

    主要来源:http://howtodoinjava.com/spring/spring-aop/writing-spring-aop-aspectj-pointcut-expressions-with ...

  8. AS3游戏中可视对象上限及位图相关的内存消耗实测

    前些天连续做了一些测试,以加深对AS3的掌握和在项目中对 游戏 性能.效率优化方面的一些处理,有很多测试实际意义不大,都不过是证明一些猜想是正确的,除此没有什么. 但前天进行的一系列测试中,有一些对游 ...

  9. 达内TTS6.0课件oop_day05

  10. Javascript 基础编程练习一

    Javascript 基础互动编程,这篇练习结合了function 函数名(), onclick 时间, prompt输入窗口, window.open和confirm窗口, 任务 1.新窗口打开时弹 ...