ADO封装类实现文件

开发 开发工具
这里介绍ADO封装类,微软公司相继推出了几种数据访问技术,先是DAO(Data Access Objects),然后是RDO(Remote Data Objects),现在是ADO(ActiceX Data Objects)。

一.引言

在过去几年中,微软公司相继推出了几种数据访问技术,先是DAO(Data Access Objects),然后是RDO(Remote Data Objects),现在是ADO(ActiceX Data Objects)。ADO是Microsoft数据库应用程序开发的新接口,是微软***的数据访问技术。它被设计用来同新的数据访问层OLE DB Provider一起协同工作,以提供通用数据访问(Universal Data Access)。ADO向我们提供了一个熟悉的,高层的对OLE DB的Automation封装接口,它简化了数据访问的过程,增加了数据访问的灵活性,是当前数据访问接口的主流技术。

用VB或者VBScript来操作ADO是非常方便的,但是如果使用C++或者是Java,就必须要处理类似Variants这样的数据结构,从而实现和C++数据结构的转换,而这种处理无疑是C++开发人员都很头疼的事情。而且ADO是应用层的编程接口,它通过OLE DB提供的COM接口访问数据,使用ADO访问数据库需要使用许多API函数和ADO的对象,对于初学者来说,可能有些难度。即便对于ADO的编程高手,经常要书写大量相同的ADO冗余代码,也会感到厌烦。看过网上不少绍封装ADO的各种文章,也各有利弊。笔者在Visual C++下也尝试封装ADO访问数据库类,使其更方便地使用现有的VC的数据类型,简化应用程序书写的逻辑,增加程序的可读性。达到了比较好的应用效果,本文将给出笔者所使用封装方法和源程序。

二.建立ADO封装类

1.ADO对象基本模型

ADO模型包含了连接对象、命令对象、域对象、参数对象、记录集对象、错误对象等。对象之间又具有层次关系,其关系如图1所示。

在VC中使用ADO访问数据库基本过程是:
◆初始化COM库,引入ADO库文件
◆用Connection对象连接数据库
◆利用建立好的连接,通过利用Recordset对象取得结果记录集进行查询、处理。
◆使用完毕后关闭连接释放对象

2.基本操作函数和数据结构

封装的ADO类应包括以下函数和数据结构:

1)建立数据库连接函数OpenDataBase()

ADO连接数据库首先要用到Connection对象,它是到数据库的物理连接,管理着应用程序和数据库之间的通讯。对于大多数的数据库系统,每一个物理连接都需要耗费大量系统内存,是宝贵的系统资源,不可滥用。考虑到应用程序的效率,每一个数据库客户端都只用一个物理连接,并且应用程序结束后应该释放。

2)关闭数据库连接函数CloseDataBase()

3)SQL查询语句函数 Select()

记录集的建立和查询结果得获取是影响应用程序得效率得关键问题。由于每一次查询结果都可能不一样,所以每个查询语句都要建立一个记录集对象。

4)执行无返回结果的SQL语句函数Excute()

5)查询结果数组pData

为了数据类型转换的方便,我们将记录集数据类型都转换为CString类型,存放在查询结果数组pData中,由于C++的CString是一个高效和功能强大的类,我们可以很方便地读取记录集中的查询结果。

6)结果数组大小nResultRow和nResultCol

3.ADO封装类实现文件

封装类头文件ADODB.H定义如下:

  1. class CADODB : public CObject  
  2. {  
  3. public:  
  4. CADODB(); //构造函数  
  5. ~CADODB(); //析构函数  
  6. public:  
  7. int nResultRow; //查询结果行数  
  8. int nResultCol; //查询结果列数   
  9. CStringArray pData; //存放查询结果数组 大小为nRow*nCol   
  10. CString errormessage; //ADO错误信息  
  11. bool OpenDataBase(CString DsnName,CString sUserID,CString sPassword);  
  12. //打开数据库连接 输入DSN名称、用户ID和密码  
  13. int Select(CString Sql); //执行SQL查询语句,结果放在数组pData中  
  14. int Excute(CString Sql); //执行无返回值得SQL语句  
  15. bool CloseDataBase(); //关闭数据库连接  
  16. protected:  
  17. _ConnectionPtr m_pConnection; //定义连接指针  
  18. }; 

4.ADO封装类实现文件

ADO封装类实现文件ADODB.CPP如下:

  1. #include "stdafx.h"     
  2. #include "ADODB.h"     
  3.  
  4. CADODB::CADODB() //构造函数,完成初始化     
  5. {     
  6. nResultRow=0; //     
  7. nResultCol=0; //记录集行数和列数     
  8. m_pConnection = NULL;     
  9. }     
  10.  
  11. CADODB::~CADODB() //关闭数据库物理连接     
  12. {     
  13. if(m_pConnection )m_pConnection->Close();      
  14. m_pConnection = NULL;     
  15. }     
  16.  
  17. bool CADODB::OpenDataBase(CString DsnName,CString sUserID,CString sPassword)     
  18. { //打开数据库连接     
  19. …     
  20. HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//创建连接对象     
  21. hr=m_pConnection->Open((_bstr_t)DsnName,(_bstr_t)sUserID,  
  22. (_bstr_t)sPassword,adOpenUnspecified); //连接数据库     
  23. …     
  24. }     
  25.  
  26. int CADODB::Select(CString SqlStr) //SQL查询语句函数     
  27. { …     
  28. try     
  29. {     
  30. hr = m_pRecordset.CreateInstance("ADODB.Recordset");//创建纪录集对象实例     
  31. hr = m_pRecordset->putref_ActiveConnection(m_pConnection);//设置连接对象     
  32. hr=m_pRecordset->Open  
  33. (vSqlString,vNull,adOpenDynamic,adLockOptimistic,adCmdText); //打开纪录集     
  34. nResultCol = m_pRecordset->Fields->GetCount();//获得纪录集总列数     
  35. while(!m_pRecordset->adoEOF)     
  36. {     
  37. for (j = 0; j < nResultCol; j++) //取一列数据     
  38. {     
  39. vValue = m_pRecordset->Fields->Item[(long)j]->Value;//取得当前记录字段数据     
  40. if(vValue.vt != 1) //数据非空     
  41. {     
  42. int type = vValue.vt;     
  43. if(VariantChangeType(&vValue1, &vValue, 0, VT_BSTR) == S_OK)    
  44. //转换数据类型(为字符串)     
  45. str=vValue1.bstrVal; //保存结果值到临时变量str中     
  46. }     
  47. if(pData.GetSize()m_pResult.SetSize(i*nResultCol+j+1);     
  48. pData[i*nResultCol+j]=str; //保存结果到数组中     
  49. m_pRecordset->MoveNext(); //移动记录集指针到下一行     
  50. i++;     
  51. }     
  52. m_pRecordset->Close();     
  53. m_pRecordset=NULL;     
  54. nResultRow=i;     
  55. }     
  56. catch(_com_error e)///捕捉异常     
  57. {     
  58. …      
  59. }     
  60. pData->FreeExtra();//释放多余的内存空间     
  61. return nResultRow;     
  62. }     
  63. …   

三.使用ADO封装类

建立了ADO封装类后,使用数据库操作就非常简单了。在需使用数据库查询的CPP文件中包含ADO封装类头文件"ADODB.H",然后定义一个CADODB类指针;接下来就是打开数据库连接。使用封装类的成员函数OpenDataBase(…),输入要连接的数据库的DSN名称、用户名和密码,就与数据库建立连接了。要注意的是如果同时连接多个数据库就要声明多个CADODB对象指针,保证数据库连接对象是全局且惟一。接下来就是,调用成员函数Select取得数据库查询结果,执行完毕后查询结果放在CADODB的成员字符数组指针pData中,数组大小可以从成员变量nResultRow和nResultCol中得出。基本步骤如下:

在"stdafx.h"中加入ADO库的导入语句

  1. #import "c:program filescommon filessystemadomsado15.dll" 
    no_namespace rename("EOF","adoEOF")  

在应用程序类中初始化COM对象,在InitInstance()中加入以下语句

  1. AfxOleInit();   

加入ADO封装类实现文件

  1. #include "ADODB.H"  
  2. …  

定义ADO封装类实现文件

  1. CADODB ADO1;   //连接数据库  
  2. CADODB ADO2;  //连接数据库  
  3. …  
  4. ADO1.OpenDataBase("数据源名称","用户ID","用户密码")  
  5. //建立连接,***次连接时调用  
  6. ADO1.Select("select * from 表名");  
  7. //执行SQL查询语句  
  8. int nRowADO1.GetResultRow();  
  9. //取得记录行数  
  10. int nColADO1.GetResultCol();  
  11. //取得记录列数  
  12. for(i=0;ifor(j=0;jprintf("第%d行第%d列的值是%s",i,j,ADO1.pData[i*nCol+j];  
  13.  …  
  14. ADO1.CloseDataBase();  
  15. //使用完后关闭数据库连接   

四.结论和建议

使用ADO封装类后,在应用程序中操作数据库的过程就变得简单了,针对一般的数据库应用程序,而且在数据量不很大的情况下,本封装类已经能够应付,在使用效率上也比较满意。但是该封装没有考虑数据访问的优化处理,数据库使用了动态连接方式,记录集也没有进行分页处理,ADO缓冲区大小和游标类型都采用缺省设置,这些在实际使用中都可能降低封装类的性能,读者可以根据不同的应用情况有针对地进行修改。

【编辑推荐】

  1. C#构造函数与C++的区别浅析
  2. 实例浅析Visual Studio 2010的C++0x特性
  3. C++标准委员会确定将concepts特性从C++0x中移除
  4. C#调用C++动态链接库方法介绍
  5. 关于C++和C#类型比较的相关表格
责任编辑:彭凡 来源: CSDN
相关推荐

2009-12-25 15:28:48

ADO类

2009-12-22 10:58:50

ADO.NET类

2009-12-21 14:14:08

ADO.NET类文件

2009-12-21 14:31:29

ADO.NET类文件

2010-10-12 11:31:07

连接MYSQL

2009-12-25 16:31:38

ADO类

2009-11-04 10:07:52

ADO.NET DbP

2009-11-12 10:15:37

ADO.NET使用

2009-12-29 10:56:06

ADO支持文件

2010-01-04 11:14:40

ADO类库

2009-12-30 16:45:31

ADO操作

2012-03-09 10:58:23

2009-12-18 16:39:59

ADO.NET基础类

2009-11-11 15:50:59

ADO内存数据对象

2009-12-24 15:42:01

ADO类库

2009-12-18 15:11:50

ADO.NET类

2009-12-31 14:18:46

ADO.NET类库

2009-12-28 16:57:40

ADO .NET 类

2009-11-04 08:38:30

ADO.NET库文件

2009-12-07 15:34:18

PHP类的封装
点赞
收藏

51CTO技术栈公众号