ADO.docx
- 文档编号:23797519
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:24
- 大小:34.21KB
ADO.docx
《ADO.docx》由会员分享,可在线阅读,更多相关《ADO.docx(24页珍藏版)》请在冰豆网上搜索。
ADO
ADO
概述
微软公司的ADO(ActiveXDataObjects)是一个用于存取数据源的COM组件。
它提供了编程语言和统一数据访问方式OLEDB的一个中间层。
允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。
访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
ADO被设计来继承微软早期的数据访问对象层,包括RDO(RemoteDataObjects)和DAO(DataAccessObjects)。
ADO在1996年冬被发布。
ADO也是一只活跃于1986-1996年的摇滚乐队。
目录[隐藏]
ADO对象总结
ADO下载
ADO是如何组织起来的?
ADO2.0特点
ADO对象编程模型
ADO使用方法
ADO编程应用
用MFCOLE创建ADO应用
用COMAPI创建ADO工程
利用ADOACCESS数据库
ADO乐队
ADO对象总结
ADO下载
ADO是如何组织起来的?
ADO2.0特点
ADO对象编程模型
ADO使用方法
ADO编程应用
用MFCOLE创建ADO应用
∙用COMAPI创建ADO工程
∙利用ADOACCESS数据库
∙ADO乐队
[编辑本段]
ADO对象总结
(1)ADO包含一些顶层的对象:
连接,代表到数据库的连接
记录集,代表数据库记录的一个集合
命令,代表一个SQL命令
记录,代表数据的一个集合
流,代表数据的顺序集合
错误,代表数据库访问中产生的意外
字段,代表一个数据库字段
参数,代表一个SQL参数
属性,保存对象的信息
ADO组件的使用需要利用支持COM的高级语言,例如ASP中的VBScript或者VisualBasic,甚至Delphi,微软的竞争对手Borland的一个产品,现在也支持使用ADO来访问数据库。
在新的编程框架.NETFramework中,微软也提供了一个面向Internet的版本的ADO,称为ADO.NET。
其对象模型和传统ADO差别很大。
ADO是一种面向对象的编程接口,微软介绍说,与其同IBM和Oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。
为实现这一目标,微软在数据库和微软的OLEDB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。
开发人员在使用ADO时,其实就是在使用OLEDB,不过OLEDB更加接近底层。
ADO的一项属性远程数据服务,支持“数据仓库”ActiveX组件以及高效的客户端缓存。
作为ActiveX的一部分,ADO也是COM组件的一部分。
ADO是由早期的微软数据接口?
?
远程数据对象RDO演化而来的。
RDO同微软的ODBC一同连接关系数据库,不过不能连接非关系数据库。
ADO向我们提供了一个熟悉的,高层的对OLEDB的Automation封装接口。
对那些熟悉RDO的程序员来说,你可以把OLEDB比作是ODBC驱动程序。
如同RDO对象是ODBC驱动程序接口一样,ADO对象是OLEDB的接口;如同不同的数据库系统需要它们自己的ODBC驱动程序一样,不同的数据源要求它们自己的OLEDB提供者(OLEDBprovider)。
目前,虽然OLEDB提供者比较少,但微软正积极推广该技术,并打算用OLEDB取代ODBC。
ADO向VB程序员提供了很多好处。
包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ADO2.0的Msado15.dll需要占用342K内存,比RDO的Msrdo20.dll的368K略小,大约是DAO3.5的Dao350.dll所占内存的60%)。
同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。
因此你可以只创建一个"Connection"对象,但是可以有多个,独立的"Recordset"对象来使用它。
ADO针对客户/服务器以及WEB应用程序作了优化。
ADO(ActiveXDataObjects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据。
例如,如果您希望编写应用程序从DB2或Oracle数据库中向网页提供数据,可以将ADO程序包括在作为活动服务器页(ASP)的HTML文件中。
当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO代码的结果。
象Microsoft的其它系统接口一样,ADO是面向对象的。
它是Microsoft全局数据访问(UDA)的一部分,Microsoft认为与其自己创建一个数据,不如利用UDA访问已有的数据库。
为达到这一目的,Microsoft和其它数据库公司在它们的数据库和Microsoft的OLE数据库之间提供了一个“桥”程序,OLE数据库已经在使用ADO技术。
ADO的一个特征(称为远程数据服务)支持网页中的数据相关的ActiveX控件和有效的客户端缓冲。
作为ActiveX的一部分,ADO也是Microsoft的组件对象模式(COM)的一部分,它的面向组件的框架用以将程序组装在一起。
ADO从原来的Microsoft数据接口远程数据对象(RDO)而来。
RDO与ODBC一起工作访问关系数据库,但不能访问如ISAM和VSAM的非关系数据库。
ADO是对当前微软所支持的数据库进行操作的最有效和最简单直接的方法,它是一种功能强大的数据访问编程模式,从而使得大部分数据源可编程的属性得以直接扩展到你的ActiveServer页面上。
可以使用ADO去编写紧凑简明的脚本以便连接到OpenDatabaseConnectivity(ODBC)兼容的数据库和OLEDB兼容的数据源,这样ASP程序员就可以访问任何与ODBC兼容的数据库,包括MSSQLSERVER、Access、Oracle等等。
比如,如果网站开发人员需要让用户通过访问网页来获得存在于IBMDB2或者Oracle数据库中的数据,那么就可以在ASP页面中包含ADO程序,用来连接数据库。
于是,当用户在网站上浏览网页时,返回的网页将会包含从数据库中获取的数据。
而这些数据都是由ADO代码做到的。
ADO是一种面向对象的编程接口,微软介绍说,与其同IBM和Oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。
为实现这一目标,微软在数据库和微软的OLEDB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。
开发人员在使用ADO时,其实就是在使用OLEDB,不过OLEDB更加接近底层。
ADO的一项属性?
?
远程数据服务,支持“数据仓库”ActiveX组件以及高效的客户端缓存。
作为ActiveX的一部分,ADO也是COM组件的一部分。
ADO是由早期的微软数据接口?
?
远程数据对象RDO演化而来的。
RDO同微软的ODBC一同连接关系数据库,不过不能连接非关系数据库。
[编辑本段]
ADO下载
目前ADO1.5版已经可以从微软网站免费下载。
到目前为止,微软网站仍是你获取有关ADO最新信息的最佳场所。
ADO1.5是作为OLEDBSDK的一部分提供的。
在下载之前请先确认OLEDBSDK提供的各项特性。
下载文件大约有15M,如果完全安装的话要占用80M的硬盘空间。
如果你只对ADO感举趣,就选择最小安装,这样只会占用你15M的硬盘空间。
在这里你可以找到许多关于ADO的示例代码和文章,尤其是在"Workshop"系列的文章中。
你也可以从本站下载ADO2.5的帮助文件。
尽管OLEDBSDK提供自己的ADO帮助文件,你会发现ADO1.0的帮助文件更易于使用。
同时它还向你提供ADO对象模型的图示
[编辑本段]
ADO是如何组织起来的?
以前的对象模型,如DAO和RDO是层次型的。
也就是说一个较低的数据对象如Recordset是几个较高层次的对象,如Environment和QueryDef,的子对象。
在创建一个QueryDef对象的实例之前,你不能创建DAORecordset对象的实例。
但ADO却不同,它定义了一组平面型顶级对象.
最重要的三个ADO对象是Connection,Recordset和Command.本文将主要介绍Connection和Recordset这两个对象。
每个Connection的属性定义了与数据源的连接。
Recordset对象接收来自数据源的数据。
Recordset可以与Connection一起起使用,先建立一个连接,然后获取数据。
尽管如此,Recordset也可以被单独创建,其Connection参数可以在Open属性定义。
[编辑本段]
ADO2.0特点
对于ADO1.5以前包括1.5的版本来说,从功能的角度来看RDO和ADO不是完全相等的.等同就意味着你可以通过这两种方法解决同样的问题;它不是指存在重命名的或者优化的功能相同的对象.因此,移植到ADO不是一个简单的事情.从另一方面来说,一旦你熟练掌握了RDO或DAO技术的话,学习ADO是件相当容易的事情.
ADO2.0的新特性包括事件处理,记录集的延续,分层目录结构指针和数据成形,分布式事务处理,多维数据,远程数据服务(RDS),以及对C++和Java的支持的增强.在钻研一些VisualBasic代码的时候将会见到所有的这些特性.当使用VisualJ++时,我将举例说明新的WindowsFoundationClasses(WFC)是如何支持ADO的.ADO的最让人激动的是在VisualStudio6.0中的任何开发工具中你都可以找到对它的充分的支持.
[编辑本段]
ADO对象编程模型
连接数据源(Connection),可选择开始事务。
可选择创建表示SQL命令的对象(Command)。
可选择指定列、表以及SQL命令中的值作为变量参数(Parameter)。
执行命令(Command、Connection或Recordset)。
如果命令以行返回,将行存储在存储对象中(Recordset)。
可选择创建存储对象的视图以便进行排序、筛选和定位数据(Recordset)。
编辑数据。
可以添加、删除或更改行、列(Recordset)。
在适当情况下,可以使用存储对象中的变更对数据源进行更新(Recordset)。
在使用事务之后,可以接受或拒绝在事务中所做的更改。
结束事务(Connection)。
[编辑本段]
ADO使用方法
一旦安装了ADO,在VB的工程->引用对话框中你就可以看到象下图所示的东西了:
选择"ActiveXDataObjects1.5Library"(ADODB).在其下的"ADORecordset1.5Library"是一个客户端的版本(ADOR),它定义了有聚的数据访问对象。
ADOR对于客户端的数据访问来说是足够的了,因为你不需要Connection对象来建立与远程数据源的联系。
如果你想要访问更多的外部数据源,你需要安装这些外部数据源自己的OLEDBProvider,就象你需要为新的数据库系统安装新的ODBC驱动程序一样。
如果该外部数据源没有自己的OLEDBProvider,你就得使用OLEDBSDK来自己为这个外部数据源创建一个OLEDBProvider了。
这已不是本文讨论的范围了。
示例
下面的示例代码以Northwinds数据库作为远程数据源,然后用ADO来访问它。
首先在控制面板中打开“32位数据源”,单击“添加”按钮。
在弹出的对话框中选择"MicrosoftAccessDriver(*.mdb)"作为数据源驱动程序。
然后按下图所示,在对话框中填写下面的内容
选择数据库Northwinds所在路径。
单击完成,退出ODBC设备管理器。
启动一个新的VB工程,在窗体的Load事件中输入下面的代码:
PrivateSubForm_Load()
DimcnAsADODB.Connection
Setcn=NewADODB.Connection
'SetConnectionproperties
cn.ConnectionString="DSN=RDCNwind;UID=;PWD=;"
cn.ConnectionTimeout=30
cn.Open
Ifcn.State=adStateOpenThen_
MsgBox"ConnectiontoNorthWindSuccessful!
"
cn.Close
EndSub
按F5运行程序,看看,一个消息框弹出来告诉你连接成功了。
请注意,这里我特别注明了是ADODB.Connection,而不是ADOR.Connection,这样做是为了将二者区分开(如果你引用了ADODB和ADOR的话,这样做很有必要)。
连接字符串看上去同RDO的连接字符串差不多。
事实上,二者确实差不多。
如果我们要访问一个SQLserver数据库,你的Connection代码看上去应象下面所示:
'设置连接属性cn.Provider="MSDASQL"
cn.ConnectionString="driver={SQLServer};"&"server=prod1;uid=bg;pwd=;database=main"
cn.Open
"Provider"属性指向SQLServer的OLEDBProvider.
回到我们的示例程序,让我们创建一个Recordset对象来访问“Orders”表,并从该表的"ShipCountry"字段中产生头十个不重复的国家名。
修改窗体Load事件中的代码,让它看上去象下面这样。
PrivateSubForm_Load()
DimcnAsADODB.Connection
DimrsAsADODB.Recordset
DimsSQLAsString
DimsOutAsString
DimCountAsInteger
Setcn=NewADODB.Connection
Setrs=NewADODB.Recordset
'SetpropertiesoftheConnection.
cn.ConnectionString="DSN=RDCNwind;UID=;PWD=;"
cn.ConnectionTimeout=30
cn.Open
Ifcn.State=adStateOpenThen_
MsgBox"ConnectiontoNorthWindSuccessful!
"
sSQL="SELECTDISTINCTOrders.ShipCountryFROMOrders"
Setrs=cn.Execute(sSQL)
'Enumeratetherecordset
sOut=""
ForCount=1To10
sOut=sOut&rs("ShipCountry")&vbCrLf
rs.MoveNext
NextCount
MsgBoxsOut,vbExclamation,"ADOResults"
cn.Close
EndSub
运行程序后,你会看到如下图所示的消息框。
不幸的是,目前这个Recrodset对象是只读的和forwardcursor。
如果你想要获取更多的功能,你需要创建一个独立的Recordset对象,该对象拥有自己的Connection属性,就象下面的代码所示:
PrivateSubForm_Load()
DimrsAsADODB.Recordset
DimsSQLAsString
DimsOutAsString
DimCountAsInteger
Setrs=NewADODB.Recordset
sSQL="SELECTDISTINCTOrders.ShipCountryFROMOrders"
rs.OpensSQL,"DSN=RDCNwind;UID=;PWD=;",adOpenDynamic
'ReportRecordsetConnectioninformation
MsgBoxrs.ActiveConnection,,"ConnectionInfo"
'Enumeratetherecordset
sOut=""
ForCount=1To10
sOut=sOut&rs("ShipCountry")&vbCrLf
rs.MoveNext
NextCount
MsgBoxsOut,vbExclamation,"ADOResults"
rs.Close
EndSub
上面代码返回的结果同前例一样,但是本代码中的Recordset是独立的。
这一点是DAO和RDO做不到的。
Recordset对象的Open方法打开一个代表从SQL查询返回的记录的游标。
虽然你可以用Connection对象同远程数据源建立连接,但请记住,在这种情况下,Connection对象和Recordset对象是平行的关系。
总结
本文仅向你介绍了ADO强大的功能的冰山一角。
微软承诺,在将来ADO将会取代DAO和RDO。
所以现在你应该考虑如何将你的数据访问代码投向ADO的怀抱。
这种转变不会很痛苦,因为ADO的语法同现有的语法差不多。
也许微软或第三方会在将来开发出转换向导来简化这一转换过程。
从现在起,你就应开发纯ADO代码的程序。
你也可以继续使用DAO或RDO代码来开发你的程序,但落伍的感觉总是不好的。
[编辑本段]
ADO编程应用
ADO(ActiveXDataObjects)是基于组件的数据库编程接口,它是一个和编程语言无关的COM组件系统。
本文主要介绍用ADO编程所需要注意的技巧和在VC下进行ADO编程的模式,并对C++Extensions进行了简单的讨论,希望对ADO开发人员有一定的帮助作用。
因为ADO是一个和编程语言无关的COM组件系统,所以这里讨论的要点适用于所有的编程语言和编程环境,比如:
VB、VBScript、VC、Java等等。
1.显式定义对象类型
实际上,这条准则不仅适用于ADO编程,也适用于其他的与COM对象相关的编程。
因为如果一开始就定义变量类型,则编译器在编译的时候就可以知道变量的类型,此时编译器实际上是采用vtable偏移的方式来得到具体的COM对象包含的方法的地址(这一点和C++中虚函数的地址获取方式类似);但如果一开始不指定变量类型的话,比如简单地采用如下的语句:
DIMmyConasObject
或者是:
DIMmyCon
这样,编译器在编译的时候就不能得到变量的类型,而只能在运行的时候动态地得到方法的信息(通过使用接口IDispatch的Invoke方法来实现),如此为了得到方法的地址和相关的变量情况就需要在内部进行两次调用,无疑会降低程序的运行速度。
2.绑定列到具体的字段对象
在程序开始时就建立对字段对象的引用,可以避免在每次得到记录后,再在Recordset:
:
Fields中进行查找而增加系统的开销。
例如,可以采用如下所示的代码:
PrivateSubTblBrowse_Click()
Dimfld1AsADODB.Field
Dimfld2AsADODB.Field
DimrsAsADODB.Recordset
setrs=g_cn.execute(...)
'g_cn为全局对象adodb.connection
Setfld1=rs.Fields(“id”)'数据表的字段
Setfld2=rs.Fields(“name”)’数据表的字段
Ifrs.BOF=FalseThen
Whilers.BOF=False
Debug.Printfld1.Value
Debug.Printfld2.Value
rs.MoveNext
Wend
EndIf
rs.Close
EndSub
3.用SQL语句和存储过程进行数据更新
尽管采用Recordset对象来更新数据是非常方便的,但是它的开销也大,通过数据源对象返回的查询集不仅包含了数据,而且也包含了元数据(metadata),在有些时候元数据可能比数据本身还要大,所以最好采用SQL语句来更新数据。
还有要使用存储过程而不是单一的SQL语句来获取信息。
因为存储过程是在服务器端执行的,只把结果返回到客户端,这样一方面可以降低网络进行数据交互的开销,另一方面使系统更加容易维护,并且能保持数据的一致性。
4.使用集合操作单条的SELECT语句
在使用游标时,最好使用集合的方法对单条的SELECT语句进行操作。
Recordset:
:
get_Collect方法和Recordset:
:
put_Collect方法是Recordset对象的快捷方式,可以快速地得到一个字段的值而不需要获得关于一个字段的引用。
例如,可以采用如下代码:
SubCollect()
DimrsAsNewRecordset
rs.ActiveConnection=“...”
rs.Source=“一条SQL查询语句”
rs.Open
Debug.Printrs.Collect(0),rs.Collect
(1),rs.Collect
(2)
Debug.Printrs!
au_id,rs!
au_fname,rs!
au_lname
EndSub
5.只查询所需要的数据
尽管很多开发人员都习惯采用“SELECT*FROMTBL”的模式进行查询,但是为了提高系统的效率,如果只需要其中某几个字段的值,最好把这几个字段直接写出来,同时需要限定返回记录集的范围(通过WHERE子句进行限定)。
6.正确选择游标的位置、类型和锁方式
如果只需要按顺序读取记录并且不需要滚动和更新记录,最好使用服务器端游标(adUseServer)、仅向前游标(adOpenForwardOnly)和读加锁(adLockReadOnly),这样可以获得最好的性能。
如果需要滚动记录,采用客户端游标(adUseServer)会比采用服务器端游标所得到的性能要好,因为ADO系统默认是采用服务器端游标类型。
当然如果数据集合相当大,采用服务器端游标的性能会好一些。
同时需要注意:
如果采用客户端游标,最好只采用读加锁(adLockReadOnly)的锁类型,因为如果需要更新数据,客户端游标引擎需要得到额外的信息(元数据),而获取这个信息的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ADO