- 浏览: 224348 次
- 性别:
- 来自: 烟台
文章分类
最新评论
-
KateAndNomi2333:
kunchong21 写道tinguo002 写道List l ...
ArrayList深拷贝的一种实现方法 -
kunchong21:
tinguo002 写道List list1 = new Ar ...
ArrayList深拷贝的一种实现方法 -
suihr:
你设置的操作系统的时区正确吗?
Tomcat5.5时区设置 -
xiao_Yao:
我用windows8 tomcat5.5无法 使用 呀
Tomcat5.5时区设置 -
hftgoodgood:
hftgoodgood 写道 ...
通用权限管理系统设计篇(三)——概要设计说明书
- 摘要:这里介绍ADO封装类,微软公司相继推出了几种数据访问技术,先是DAO(Data Access Objects),然后是RDO(Remote Data Objects),现在是ADO(ActiceX Data Objects)。
- 标签:ADO封装类
一.引言
在过去几年中,微软公司相继推出了几种数据访问技术,先是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定义如下:
- class CADODB : public CObject
- {
- public:
- CADODB(); //构造函数
- ~CADODB(); //析构函数
- public:
- int nResultRow; //查询结果行数
- int nResultCol; //查询结果列数
- CStringArray pData; //存放查询结果数组 大小为nRow*nCol
- CString errormessage; //ADO错误信息
- bool OpenDataBase(CString DsnName,CString sUserID,CString sPassword);
- //打开数据库连接 输入DSN名称、用户ID和密码
- int Select(CString Sql); //执行SQL查询语句,结果放在数组pData中
- int Excute(CString Sql); //执行无返回值得SQL语句
- bool CloseDataBase(); //关闭数据库连接
- protected:
- _ConnectionPtr m_pConnection; //定义连接指针
- };
4.ADO封装类实现文件
ADO封装类实现文件ADODB.CPP如下:
- #include "stdafx.h"
- #include "ADODB.h"
- CADODB::CADODB() //构造函数,完成初始化
- {
- nResultRow=0; //
- nResultCol=0; //记录集行数和列数
- m_pConnection = NULL;
- }
- CADODB::~CADODB() //关闭数据库物理连接
- {
- if(m_pConnection )m_pConnection->Close();
- m_pConnection = NULL;
- }
- bool CADODB::OpenDataBase(CString DsnName,CString sUserID,CString sPassword)
- { //打开数据库连接
- …
- HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//创建连接对象
- hr=m_pConnection->Open((_bstr_t)DsnName,(_bstr_t)sUserID,
- (_bstr_t)sPassword,adOpenUnspecified); //连接数据库
- …
- }
- int CADODB::Select(CString SqlStr) //SQL查询语句函数
- { …
- try
- {
- hr = m_pRecordset.CreateInstance("ADODB.Recordset");//创建纪录集对象实例
- hr = m_pRecordset->putref_ActiveConnection(m_pConnection);//设置连接对象
- hr=m_pRecordset->Open
- (vSqlString,vNull,adOpenDynamic,adLockOptimistic,adCmdText); //打开纪录集
- nResultCol = m_pRecordset->Fields->GetCount();//获得纪录集总列数
- while(!m_pRecordset->adoEOF)
- {
- for (j = 0; j < nResultCol; j++) //取一列数据
- {
- vValue = m_pRecordset->Fields->Item[(long)j]->Value;//取得当前记录字段数据
- if(vValue.vt != 1) //数据非空
- {
- int type = vValue.vt;
- if(VariantChangeType(&vValue1, &vValue, 0, VT_BSTR) == S_OK)
- //转换数据类型(为字符串)
- str=vValue1.bstrVal; //保存结果值到临时变量str中
- }
- if(pData.GetSize()m_pResult.SetSize(i*nResultCol+j+1);
- pData[i*nResultCol+j]=str; //保存结果到数组中
- m_pRecordset->MoveNext(); //移动记录集指针到下一行
- i++;
- }
- m_pRecordset->Close();
- m_pRecordset=NULL;
- nResultRow=i;
- }
- catch(_com_error e)///捕捉异常
- {
- …
- }
- pData->FreeExtra();//释放多余的内存空间
- return nResultRow;
- }
- …
三.使用ADO封装类
建立了ADO封装类后,使用数据库操作就非常简单了。在需使用数据库查询的CPP文件中包含ADO封装类头文件"ADODB.H",然后定义一个CADODB类指针;接下来就是打开数据库连接。使用封装类的成员函数OpenDataBase(…),输入要连接的数据库的DSN名称、用户名和密码,就与数据库建立连接了。要注意的是如果同时连接多个数据库就要声明多个CADODB对象指针,保证数据库连接对象是全局且惟一。接下来就是,调用成员函数Select取得数据库查询结果,执行完毕后查询结果放在CADODB的成员字符数组指针pData中,数组大小可以从成员变量nResultRow和nResultCol中得出。基本步骤如下:
在"stdafx.h"中加入ADO库的导入语句
- #import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF","adoEOF")
在应用程序类中初始化COM对象,在InitInstance()中加入以下语句
- AfxOleInit();
加入ADO封装类实现文件
- #include "ADODB.H"
- …
定义ADO封装类实现文件
- CADODB ADO1; //连接数据库
- CADODB ADO2; //连接数据库
- …
- ADO1.OpenDataBase("数据源名称","用户ID","用户密码")
- //建立连接,第一次连接时调用
- ADO1.Select("select * from 表名");
- //执行SQL查询语句
- int nRow= ADO1.GetResultRow();
- //取得记录行数
- int nCol= ADO1.GetResultCol();
- //取得记录列数
- for(i=0;ifor(j=0;jprintf("第%d行第%d列的值是%s",i,j,ADO1.pData[i*nCol+j];
- …
- ADO1.CloseDataBase();
- //使用完后关闭数据库连接
四.结论和建议
使用ADO封装类后,在应用程序中操作数据库的过程就变得简单了,针对一般的数据库应用程序,而且在数据量不很大的情况下,本封装类已经能够应付,在使用效率上也比较满意。但是该封装没有考虑数据访问的优化处理,数据库使用了动态连接方式,记录集也没有进行分页处理,ADO缓冲区大小和游标类型都采用缺省设置,这些在实际使用中都可能降低封装类的性能,读者可以根据不同的应用情况有针对地进行修改。
发表评论
-
eclipse下启动tomcat出现Setting property 'source' to 'org.eclipse.jst.jee.server: '错误的
2012-09-19 13:52 942eclipse下启动tomcat出现Setting pr ... -
java List remove 时的小问题
2011-11-16 17:33 1643From:http://hi.baidu.com/xia ... -
HP ProLiant DL380 G6 服务器 - 内存的插法详解
2011-11-15 14:05 2505HP ProLiant DL380 G6 服务器 - 内 ... -
Tomcat5.5时区设置
2011-10-21 11:00 2007项目中遇到Tomcat时间跟系统时间不一致的情况,在网上 ... -
记录tomcat控制台输出日志
2010-11-11 10:23 1728今天把用了2年的tomcat重新整了下,终于解决了日志的记录 ... -
成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件
2010-11-11 10:19 6233http://www.blogjava.net/flysky1 ... -
关于img src值为空时,2次请求问题的深入调研
2010-08-25 14:19 1380http://hi.baidu.com/bdui/blog ... -
java String.getBytes()编码问题
2010-07-29 16:11 1680http://hi.baidu.com/miserce/b ... -
Java 中的位运算
2010-06-28 09:50 1091移位运算符 包括: “>> 右移 ... -
设置eclipse启动参数解决内存不足问题
2010-03-16 16:17 2017http://www.21jn.net/html/62/n-5 ... -
JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)
2010-02-03 10:06 1398http://blog.csdn.net/wjp5536509 ... -
com.mysql.jdbc.CommunicationsException: Communications link failure due to under
2010-01-16 14:08 2580com.mysql.jdbc.CommunicationsEx ... -
java术语(PO/POJO/VO/BO/DAO/DTO)
2010-01-13 16:01 963PO(persistant object) 持久对 ... -
Eclipse下插件安装
2009-11-09 14:09 936Eclipse plugin resource center ... -
Java/J2EE中文问题终极解决之道
2009-10-21 14:23 723Java/J2EE中文问题终极解 ... -
ArrayList深拷贝的一种实现方法
2009-09-16 11:29 15906大家应该理解浅拷贝和 ... -
使用Java多线程实现任务分发
2009-09-14 10:28 1025使用Java多线程实现任 ... -
ExecutorService来进行线程池的方式实现多线程
2009-09-12 10:16 2175ExecutorService来进行线程池的方式实现多线程 ... -
openssl 生成pem 建立CA
2009-08-24 13:45 2310openssl 生成pem 建立CA 关 ... -
Java删除目录及目录下的所有文件
2009-08-21 15:45 2561Java删除目录及目录下的所有文件 java中删除目录事 ...
相关推荐
在这个场景中,"ADO封装类文件 数据库访问"指的是在VC6.0环境下,已经编写完成的用于简化ADO操作的C++类库,包括两个文件:ADOConn.h和ADOConn.cpp。 **ADOConn.h** 文件通常会定义一个名为ADOConn的类,这个类是对...
下面我们将深入探讨这个小而强悍的C++ ADO封装类。 **1. ADO基础概念** - **ADO对象模型**:ADO包含一系列的对象,如Connection(连接)、Recordset(记录集)、Command(命令)等,它们构成了数据库操作的基础。...
标签中的“ado,ado封装类,unicode ado, vs2008 ado,ado连接Oracle”进一步明确了关键主题。"ado"和"vs2008 ado"都指向ADO在VS2008中的应用;"ado封装类"再次强调了自定义类的使用;"unicode ado"指代在ADO中实现...
本篇将详细讲解标题为“ADO.zip_ado 封装类_ado封装类_数据库封装类”的压缩包所包含的ADO封装类,以及其在数据库连接中的应用。 首先,了解ADO的基本概念。ADO是.NET框架早期版本中的数据访问技术,它提供了与数据...
`Ado.cpp`通常包含了封装类的实现细节,包括对ADO对象的创建、初始化、执行SQL语句、处理结果集等功能的实现。`Ado.h`则定义了封装类的接口,包括类的声明、成员函数的原型等,供其他模块调用。 封装ADO的主要目的...
本文将详细讨论一个简单的ADO封装类,帮助你理解其工作原理和使用方法。 标题中的"一个简单的ADO封装类"指的是一个将ADO基本功能进行封装的类库,这样的封装使得开发者可以更高效、更便捷地在程序中调用ADO功能,而...
封装类中,可能包括填充记录集、移动记录、添加新记录、更新和删除记录的方法。 4. **参数对象(Parameter Object)**:用于在命令对象中传递参数,常用于存储过程。 在`Ado.cpp`和`Ado.h`文件中,我们可以期待...
以【标题】"使用ADO封装类的数据库程序开发实例[第二版] 源码"为例,结合【描述】中的关键点,如SQL Server、Access、图片存取和XML文件的导入导出,我们将详细阐述这些知识点。 1. ADO封装:ADO是Microsoft提出的...
本文将基于给定的文件“使用ADO封装类的数据库程序开发实例[第二版].doc”中的内容,深入探讨使用ADO封装类来进行数据库程序开发的具体实践与技巧。 #### 二、ADO概述 ADO 是 Microsoft 开发的一种数据库访问技术,...
"ADO.rar_ado封装类_vc ado"这个压缩包文件显然是为了简化VC++中ADO编程而设计的封装类库。下面我们将深入探讨ADO的基本概念、其在VC++中的应用以及封装类的重要性。 ADO是Microsoft的数据访问接口,它是ODBC(Open...
下面将详细解释ADO、封装类的概念以及如何利用这些文件进行数据库操作。 **ADO(ActiveX Data Objects)** ADO是微软的OLE DB技术的一部分,它提供了一种简单而高效的方式来访问和操作数据库。通过ADO,开发者可以...
在IT行业中,数据库编程是至关重要的一个领域,尤其是在企业级应用开发中。ADO(ActiveX Data Objects)是Microsoft提供的一...在实际项目中,根据具体需求设计和实现合适的ado封装类,是提升软件质量的关键步骤之一。
综上所述,这个ado.rar压缩包提供了一个用VC++实现的ADO封装类库,它将ADO的复杂性隐藏在简洁的类接口后面,方便开发者进行数据库操作。通过ado2.cpp和ado2.h这两个文件,我们可以看到如何使用C++来构建这样的类,并...
在VC++项目中,首先需要包含ADO的头文件,如`#import <msado15.dll>`,并链接相应的库文件。然后,可以创建`_Connection`、`_Recordset`等对象来建立数据库连接和执行查询。 4. **自封装ADO类的关键组件**: - **...
本实例将探讨如何利用ADO封装类进行数据库操作,提高代码的可读性和可维护性。以下是关于ADO封装类在数据库程序开发中的详细知识讲解: 1. ADO基础: ADO是微软开发的数据访问组件,它是OLE DB的一部分,提供了与...
本知识点主要围绕标题"ado封装类(vc++6)",描述中的"一个非常完善的ado的封装类"进行展开,我们将探讨如何创建和使用一个ADO封装类,以及它在VC++ 6.0中的实现。 首先,ADO封装类的目的是为了简化编程,通过将ADO...
在这个压缩包中,包含了两个文件:AdoDB.cpp和AdoDB.h,它们很可能是实现了一个ADO的C++封装类。下面将详细介绍这个封装类可能包含的关键知识点。 首先,`AdoDB.h`文件通常会定义一个或多个类,这些类是对ADO对象的...
"使用ADO封装类的数据库程序开发实例[第二版]"是一个教程或书籍,旨在教导开发者如何高效地利用ADO进行数据库操作,并通过封装类来提高代码的可复用性和可维护性。 首先,我们需要了解ADO的核心概念。ADO包括一系列...
`ado操作.txt`文件很可能是关于如何使用这些封装类进行数据库操作的说明或者示例代码,包括如何连接数据库、执行查询、处理记录集等内容。例如,可能包含以下步骤: 1. 引入ADO库:在项目中添加对`msado15.dll`的...
ADO(ActiveX Data Objects)是微软...通过这个封装类,开发者可以更专注于业务逻辑,而不用过多关注数据库操作的底层实现,从而提高开发效率。在实际应用中,只需根据项目需求选择合适的数据库系统,即可无缝切换。