一:概念介绍
1、ADO
ADO 并不是自动和您现存的数据访问应用程序代码兼容的。当 ADO 封装 DAO 和 RDO 的功能性的时候,您必须将许多语言要素转换为 ADO 语法。在某些情况下,这将意味着您现存代码的某些功能的一个简单转换。在其他情况下,最佳的做法可能是用 ADO 的新功能重写该应用程序。
2. DAO
DAO (Data Access Objects) 数据访问对象是第一个面向对象的接口,它显露了 Microsoft Jet 数据库引擎(由 Microsoft Access 所使用),并允许 Visual Basic 开发者通过 ODBC 象直接连接到其他数据库一样,直接连接到 Access 表。DAO 最适用于单系统应用程序或小范围本地分布使用。
与ODBC一样,DAO提供了一组API供编程使用。MFC也提供了一组DAO类,封装了底层的API,从而大大简化了程序的开发。利用MFC的DAO类,用户可以编写独立于DBMS的应用程序。 DAO是从Visual C++4.0版开始引入的。一般地讲,DAO类提供了比ODBC类更广泛的支持。一方面,只要有ODBC驱动程序,使用Microsoft Jet的DAO就可以访问ODBC数据源。另一方面,由于DAO是基于Microsoft Jet引擎的,因而在访问Access数据库(即*.MDB文件)时具有很好的性能。
DAO的特色:DAO可以通过ODBC驱动程序访问ODBC数据源。但DAO是基于Microsoft Jet引擎的,通过该引擎,DAO可以直接访问Access、FoxPro、dBASE、Paradox、Excel和Lotus WK等数据库。CDaoDatabase类可以直接与这些数据库进行连接,而不必在ODBC管理器中注册DSN。例如,下面的代码用来打开一个FoxPro数据库:
CDaoDatabase daoDb;
daoDb.Open( “”,FALSE,FALSE,"FoxPro 2.5;DATABASE=c:\\zyf");
CDaoDatabase::Open函数用来连接某个数据库,该函数的声明为:
virtual void Open( LPCTSTR lpszName, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T("") );
throw( CDaoException, CMemoryException );
DAO是Microsoft一种用来访问Jet引擎的方法,主要用来访问Access数据库,使用起来比较简单。
如果你想看这几种方法的详细说明与区别,可以参考开发文档中的几篇数据库访问的文章。
3. RDO
RDO (Remote Data Objects) 远程数据对象是一个到 ODBC 的、面向对象的数据访问接口,它同易于使用的 DAO style组合在一起,提供了一个接口,形式上展示出所有 ODBC 的底层功能和灵活性。尽管 RDO 在很好地访问 Jet 或 ISAM 数据库方面受到限制,而且它只能通过现存的 ODBC 驱动程序来访问关系数据库。但是,RDO 已被证明是许多 SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO 提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。
4. ODBC
ODBC是Microsoft的基于关系数据库一种互连技术,它只能访问关系数据库,如果使用SQLAPI进行编程,效率较好,但代码较多,如果使用MFC ODBC封装的类进行访问比较简单。
ADO是一种基于COM的数据库访问技术,可以访问关系数据库与非关系数据库,由于它是基于COM的,访问速度也较快,占用资源较小。
5 。OLE DB
OLE DB 是 一 种 技 术 标 准, 目 的 是 提 供 一 种 统 一 的 数 据 访 问 接 口, 这 里 所 说 的“ 数 据”, 除 了 标 准 的 关 系 型 数 据 库 中 的 数 据 之 外, 还 包 括 邮 件 数 据、Web 上 的 文 本 或 图 形、 目 录 服 务(Directory Services), 以 及 主 机 系 统 中 的IMS 和VSAM 数 据。OLE DB 标 准 的 核 心 内 容 就 是 要 求 以 上 这 些 各 种 各 样 的 数 据 存 储(Data Store) 都 提 供 一 种 相 同 的 访 问 接 口, 使 得 数 据 的 使 用 者( 应 用 程 序) 可 以 使 用 同 样 的 方 法 访 问 各 种 数 据, 而 不 用 考 虑 数 据 的 具 体 存 储 地 点、 格 式 或 类 型。
二 异同等
1 。演变过程
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
ADO 是 DAO/RDO 的后继产物。ADO 2.0在功能上与 RDO 更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO “扩展”了 DAO 和 RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。例如,ADO 没有与 rdoEngine 和 rdoEnvironment 对象相等同的对象,可以显露 ODBC 驱动程序管理器和 hEnv 接口。尽管事实上您的接口可能是通过 ODBC OLE DB 服务提供程序实现的,但您当前也不能从 ADO 中创建 ODBC 数据源。
包含在 DAO 和 RDO 模型中的许多功能被合并为单个对象,这样就生成了一个简单得多的对象模型。然而,由于这个原因,起初您可能会觉得找到合适的 ADO 对象、集合、属性、方法,或事件非常困难。与 DAO 和 RDO不同的是,尽管 ADO 对象是分层结构的,但在分层结构范围之外也是可以创建的。
不过,也应当注意,ADO 当前并不支持 DAO 的所有功能。ADO 主要包括 RDO 风格的功能性,以便和 OLE DB 数据源交互,另外还包括远程和 DHTML 技术。
一般说来,在 ADO 的演化过程中,马上把大多数 DAO 应用程序(except possibly是那些使用 ODBCDirect 的应用程序)移植到 ADO 上可能为时太早,因为当前的 ADO 并不支持数据定义 (DDL)、用户、组,等等。不过,如果您只将 DAO 用于客户—服务器应用程序,而并不依赖于 Jet 数据库引擎或不使用 DDL,那么您现在就可能移植到 ADO。最终,Microsoft 将提供一个 ADO DDL 部件来帮助进行 DAO 到 ADO 的移植,并为 OLE DB 供应商提供一般的 DDL 支持。
ADO被设计来继承微软早期的数据访问对象层,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被发布。
ADO包含一些顶层的对象:
连接,代表到数据库的连接
记录集,代表数据库记录的一个集合
命令,代表一个SQL命令
记录,代表数据的一个集合
流,代表数据的顺序集合
错误,代表数据库访问中产生的意外
字段,代表一个数据库字段
参数,代表一个SQL参数
属性,保存对象的信息
ADO组件的使用需要利用支持COM的高级语言,例如ASP中的VBScript或者Visual Basic,甚至Delphi,微软的竞争对手Borland的一个产品,现在也支持使用ADO来访问数据库。
在新的编程框架.NET Framework中, 微软也提供了一个面向Internet的版本的ADO,称为ADO.NET。其对象模型和传统ADO差别很大。
2 。ADO又与ODBC
有很多种使用数据库的方法,对大多数数据库来说,选择C++这种产品也许并不适宜。我们知道,像dBASE IV,FoxPro,Oracle和Access这样的产品是完全以数据库管理为中心的。事实上,这些产品非常善于创建数据库管理器,以至于它们确实并不善于做太多其它的工作。即使要用更通用化而非更专用化的数据库产品来执行一些类型的工作,在使程序设计更容易这一方面,像VisualBasic和Delphi这样的RAD环境也要比Visual C++强很多。
你是不是对我的说法感到很奇怪?下面我就要谈一谈,在谈到使用数据库管理系统(DBMS)这个话题时,用Visual C++实际上可以做些什么。虽然上述其它语言使得编写成熟的包括用户界面和高速搜索能力的DBMS就像孩子做游戏一样容易,但是,它们缺少Visual C++可以提供的某些重要东西。你不能为使用Access的数据库轻松地编写出实用程序。正像实用程序的定义所说的,实用程序应该很小并且具备可移植性——Access应用程序却不是这样。即使用Access这样的产品创建的程序可以很小并且可以移植,你仍有其它方面的需求:底层的功能。
注:编写数据库实用程序及驱动程序时,可以选择Visual C++语言。
想像一下,使用像Visual Basic这样的语言来与实时数据采集设备打交道的情况。在进行底层访问时,RAD的保护环境常常使程序员不能进行有效的处理。当然,数据采集设备几乎不依赖于简明的连接。你打算如何把Visual Basic和外部的数据源连接起来呢?数据源甚至可能不了解Windows,DOS或类似的成熟的操作系统。
只要使用得当,很容易看到Visual C++是一种不可或缺的数据库管理工具。针对大规模的应用程序,即使你仍想依赖于Visual Basic这样的RAD语言,也请考虑一下Visual C++,它创建的程序规模小、提供底层访问并能提供实时访问。事实上,你可能还没有想到,Visual C++数据库应用程序的市场是很有潜力的。随着人们在旅途中越来越多地使用膝上型和掌上型电脑,这两类电脑上的数据库应用程序也变得越来越普通。你也许能够适应今天的膝上型电脑上的Access应用程序,但谈到硬盘大小或内存需求时,公司里较老的膝上型电脑可能就达不到要求。运行Windows CE的掌上型电脑在运行这个Access应用程序时,肯定会发生故障。在这一数据库市场的新领域,Visual C++提供了无价无限的工具。
Web链接 谈到使用Visual C++和数据库,其实你并不孤单。从一开始就有数据库专用新闻组提供有关数据库创建技巧的帮助,比如microsoft.public.access。不过,这些新闻组提供的是通用信息,对实际编写应用程序并非全都那么有用。专门针对Visual C++问题的新闻组是microsoft.public.vc.database和microsoft.public.vc.mfcdatabase。如果你决定用ODBC访问数据库,可能还要查看一下microsoft.public.odbc.sdk新闻组,它讨论的不仅仅是SDK。对最新技术感兴趣的程序员可以查阅microsoft.public.ado新闻组,或者microsoft.public.oledb(对象链接和嵌入数据库)新闻组,前者讨论ADO,后者讨论ADO的基础技术。在microsoft.public.ado.rds有一个ADO子组,它讨论远程数据访问。
既然所有的疑惑都消除了,大多数人的信心也就增强了,下面我们就介绍两种使C++访问数据库中的数据的主要方法:ODBC(开放数据库互连)和ADO(ActiveX数据对象)。在本章中,将介绍这两种类型的访问方法,但我想你会发现,ADO方法是针对新的程序设计情形而采用的。它克服了早期技术的诸多限制,依赖于Microsoft新的底层访问方法OLE-DB(对象链接和嵌入数据库)。在本书的后面我们会看到,用ADO和Visual C++提供的各种向导来汇集数据库工程,其速度有多快。
注 ODBC通常用来访问不具备OLE-DB特性的非Microsoft数据库中的数据;16位的ODBC驱动程序工作起来可能非常缓慢。
ODBC素以最慢的数据访问方法而著称,但是很可惜,当ADO或DAO都不支持某个数据库管理器而ODBC支持这个数据库管理器时,在这种特定的情形下,你仍然需要使用ODBC。在大多数情况下,这意味着要从数据库厂商那里获得所需的驱动程序,虽然Visual C++确实附带了一些产品的驱动程序(如果你正在使用数据库管理器的某些神秘功能,那么就需要建立自己的接口棗这并不是一件十分困难的事)。本质上讲,你总是要使用ODBC来访问Microsoft产品之外的其它DBMS产品所创建的数据库,这些数据库并不具备OLE-DB功能。ODBC还要求做一些额外的工作棗为ADO调整Visual C++中的大部分向导。
高级技巧
除了使用ADO和ODBC外,你还可以使用像DAO(数据访问对象)这样的早期技术,该技术包含在像Access这样的Microsoft产品中。DAO依赖于用Microsoft Access自动获得的Microsoft Jet数据库引擎。DAO还是较早版的Visual Basic所使用的引擎(最新版的Visual Basic和Visual C++依赖于相同的ADO/OLE-DB组合),所以如果需要支持较早的Visual Basic应用程序,那么DAO仍是一个不错的选择。
尽管Microsoft文件声明,可以用DAO访问非Microsoft产品建立的数据库,但你仍会发现,在这种情况下,使用ADO和ODBC要好得多。这样的话,不但兼容性问题会少一些,速度也将有所提高,因为数据请求经过的接口层减少了。有一条经验要记住,DAO是设计用来处理MDB文件的。
ADO的一个问题是,它不支持远程通信。这是Microsoft提出RDO(远程数据对象)的原因之一。这种特别技术在Visual Basic应用程序中的使用,要比在Visual C++中的使用多得多,所以我猜想,你们中有很多人都在使用它。但是,记住RDO仍是一种生命力很强的技术,这一点很重要。ADO确实具有替代RDO的远程数据服务(RDS)特征。换言之,ADO在一个软件包中提供了DAO和RDO两种功能性。
3. DAO和ODBC
DAO类与ODBC类相比具有很多相似之处,这主要有下面几点:
二者都支持对各种ODBC数据源的访问。虽然二者使用的数据引擎不同,但都可以满足用户编写独立于DBMS的应用程序的要求。
DAO提供了与ODBC功能相似的MFC类。例如,DAO的CDaoDatabase类对应ODBC的CDatabase类,CDaoRecordset对应CRecordset,CDaoRecordView对应CRecordView,CDaoException对应CDBException。这些对应的类功能相似,它们的大部分成员函数都是相同的。AppWizard和ClassWizard对使用DAO和ODBC对象的应用程序提供了类似的支持。
由于DAO和ODBC类的许多方面都比较相似,因此只要用户掌握了ODBC,就很容易学会使用DAO。实际上,用户可以很轻松地把数据库应用程序从ODBC移植到DAO。
Visual C++随盘提供了一个名为DaoEnrol的例子,该例实际上是Enroll的一个DAO版本。读者可以打开DaoEnrol工程看一看,它的源代码与Enroll的极为相似。读者可以按照建立Enroll的步骤来建立DaoEnrol,其中只有若干个地方有差别,这主要有以下几点:
选取的数据源不同。在用AppWizard创建DaoEnrol时,以及在用ClassWizard创建CDaoRecordset类的派生类时,在Database Options对话框中应该选择DAO而不是ODBC。而且DAO的数据源是通过选择一个.MDB文件来指定的,即点击“...”按钮后在文件对话框中选择要访问的.MDB文件。
记录集的缺省类型不同。ODBC记录集的缺省类型是快照(Snapshot),而DAO则是动态集(Dynaset)。
参数化的方式不同。DAO记录集的m_strFilter和m_strSort中的参数不是“?”号,而是一个有意义的参数名。例如,在下面的过滤器中有一个名为CourseIDParam的参数。
m_pSet->m_strFilter ="CourseID = CourseIDParam";
在DoFieldExchange函数中,有下面两行:
pFX->SetFieldType(CDaoFieldExchange::param);
DFX_Text(pFX, _T("CourseIDParam"), m_strCourseIDParam);
DFX函数的第二个参数也是CourseIDParam。
处理异常的方式不同。例如,在删除记录时,对异常的处理如下所示:
try
{
m_pSet->Delete();
}
catch(CDaoException* e)
{
AfxMessageBox(e->
m_pErrorInfo->m_strDescription);
e->Delete();
}
除了上述差别外,AppWizard和ClassWizard也隐藏了一些细微的不同之处,例如,DAO记录集是使用是DFX数据交换机制(DAO record field exchange)而不是RFX,在DAO记录集的DoFieldExchange中使用的是DFX函数而不是RFX函数。
4。ADO和ODBC的连接
1. ADO即 ActiveX Data Objects ,是微软提供的使ASP具有访问数据库的Components ADO的访问的速度更快,内存需要更小。先让我们看看如何用ASP结合connection属性创建一个数据库连接。
字符串形式连接一个SQL Server库
代码中conn的open方法是打开一个连接用的,后边跟一个字符串。driver={SQL Server}的意思是,连接的是一个SQL Server的库,server=localhost中的localhost代表的是本机的IP,你的数据库服务器IP是多少,这里就改成相应的值,UID和PWD这两个是登录数据库服务器的用户名和密码,最后一个选项是你要操作的数据库的名字。
2、开放资料链接 (Open Database Connectivity, ODBC) 是链接数据库的共通界面。ODBC 是由微软主导的数据库链接标准,实作环境也以微软的系统最成熟
SQLServer:
Set con = Server.CreateObject("ADODB.Connection")
con.Open "数据源名", "登录名", "密码"
Access:
Set con = Server.CreateObject("ADODB.Connection")
con.Open "数据源名"
3 。结束语
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Ronger0828/archive/2009/02/19/3909181.aspx