远程数据对象
应用程序接口
远程数据对象 是微软的一个应用程序接口,让写Windows应用程序的程序师能够进入微软和其他的数据库供给者的数据库。然后,程序中 RDO 陈述使用微软的底层数据存取对象 (DAO) 来实际进入数据库。 数据库供给者写入 DAO接口。 RDO 已经发展到微软为新的程序推荐的程序接口--- ActiveX 数据对象。 ADO也提供进入非关系数据库的接口而且比较容易使用。
简介
远程数据对象 RDO(RemoteDataObjects)是一个到 ODBC 的、面向对象的数据访问接口,它同易于使用的 DAO style组合在一起,提供了一个接口,形式上展示出所有 ODBC 的底层功能和灵活性。尽管 RDO 在很好地访问 Jet 或 ISAM 数据库方面受到限制,而且它只能通过现存的 ODBC 驱动程序来访问关系数据库。但是,RDO 已被证明是许多 SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO 提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。
RDO(Remote Data Objects)处理一组对象以完成远程资料的存取,它是在ODBC API和驱动程序之上的一个可程序的薄层(thin code layer),用以建立资料结果集(result set)和光标,以及用最小的工作站资源执行复杂的程序。
注意RDO祇能在32位的操作系统上执行(如Windows95或NT)
主题
l RDO的特性 介绍RDO的重要特性
l 以RDO写程序 介绍RDO对象模型
l 和Jet/DAO之间的比较 RDO的特性如何与DAO对应
l 初始化rdoEngine对象 rdoEngine对象的概观与如何去设定它的属性
l 建立rdoEnvironment对象 rdoEnvironment对象的概观以及如何应用它的属性来做数据存取
l 使用RDO来执行查询 如何建立以及执行有参数的查询
l 使用RDO来执行stored procedure 介绍如何与有特殊需求的store procedure一起运作
l 建立RDO光标 介绍如何建立RDO光标
l 使用RDO结果集 介绍如何使用从查询传回的资料以及参数
l 使用ODBC API函数 介绍RDO支持的ODBC handles
l 使用RemoteData控件(control) 如何用RemoteData控件处理数据
RDO的特性和客户端/伺服端的设计目标
使用RDO时,程序可以直接存取ODBC的资料源而不需要本地端的查询处理。这会在存取远程的数据库引擎时大大地提高效率和弹性。
使用RDO可以得到下列的好处。特别是在客户端/伺服端架构
l 提高自远程ODBC资料源存取资料的效率。
l 建立简单而无光标的结果集,或是较为复杂的光标。
l 执行查询以及同时运作多结果集:经由一个单一的查询可以传回多个结果集,这可以提高查询处理器和系统资源的使用效率。例如可以使用一个查询来提供多个显示资料对象的资料(如data-driven的list box)或查询一起运作,可以正确的设定scroll bar和progress status bars。
l 以单一批次(batch)执行多个action查询:在很多状况下可能是以单一的SQL述句来执行多个新增(INSERT)、删除(DELETE)和修改(UPDATE)的动作,这可以减少网络和远程处理的负载,同时让处理交易(transaction)更方便。
l 可以使用参数输入stored procedure,以及传回结果:从stored procedure输出参数是从Oricle的stored procedure上获得运算结果的唯一来源。这会在单一查询以及许多管理的运作上有用。在很多状况下,必须藉由stored procedure传回的结果来判断所执行的运作是否成功。RDO经由rdoParameter对象来处理这些输入、输出的参数。
l 限制处理以及传回的记录数:在某些状况下,使用者所选的记录数目可能超过实际运作的量,RDO可以设定经查询传回的记录数目量。以这种方式可以预测响应时间,也更容易管理工作站和服务器的资源。以同样的机制可以限制修改查询(data-modification query)所能影响记录数的量。
l 利用伺服端光标:一些伺服端数据库引擎也提供了光标的运作,在某些状况下使用伺服端光标可以减轻网络负荷以及工作站的资源以提升效率。
l 监控远程资料源所产生的讯息或错误但不妨碍正在执行的查询。
l 执行异步查询:能够使用同步、异步事件驱动(event-driven)异步等处理,使程序不会在执行大量查询时停滞。且不需要使用Polling机制。在异步查询期间,Connection会一直保留着。
l 在初始设定的查询截止时间到时,仍可继续:当查询的运作时间超过QueryTimeout属性时,RDO允许继续另一个查询等待时间,而不直接停止查询。
l 提供改良的多形(polymorphism)和“free-standing”的对象产生方式:RDO支持以DIM宣告且产生对象的方式,这种free-standing的对象可以被连结到其它的对象以执行运作。例如,可以独立的产生rdoQuery和rdoConnection对象,而后联合在一起运作。
l 提供分离的结果集:RDO允许产生静态的读写光标而后中断与远方服务器的连结。在rdoResultset对象中的资料仍可存取,一但以另一个rdoConnection对象再连结上远程伺服机时,可以以BatchUpdate方法以完成这种离线(offline)的改变。
l 产生和管理开放式的批次更新:当ODBC光标链接库提供开放式更新时,它是以一笔接着一笔的方式而非批次更新。这种做法需要较多的网络和服务器的频宽。RDO提供新的客户端批次(Client Batch)光标,将一群被新增,修改和删除的记录集合起来。这种方式祇需要与伺服端连结一次,因此可以提升效率
l 让Stored Procedures使用更容易:RDO允许将可输入参数的查询和stored procedure当成rdoConnection对象的方法。可以像使用VB函数传入参数的方式一样传入参数而不需要rdoParameter对象。
l 提供之下的ODBC handles:当需要更直接,更有弹性的资料存取时,RDO提供直接存取ODBC环境(environment),connection和statement 等handles。
l 减少内存使用
以RDO写作程序【2】
RDO对象和集合提供了写作程序和维护远程ODBC资料的的架构。对象和集合有描述数据库特性的属性和操作数据库的方法。使用这种包含子对象的架构可以建构出对象与对象或对象与集合等等的关系,而这些关系表现了数据库系统的逻辑结构。
除了rdoEngine对象外,其余所有的对象都是由相关的集合在维护。当RDO在第一次存取而被初始化时,会自动产生rdoEngine对象以及内含的rdoEnvironments(0)对象。
RDO的程序写作结构与DAO相似,但更注重在stored procedure的操作和传回的资料集,相对的对ISAM资料的存取则较不重视。
下表为各对象的简介
RDO对象 描述 rdoEngine 最基础的对象,当第一次存取RDO对象时会自动产生。 rdoError 处理ODBC错误以及RDO所产生的讯息。也是自动产生的。 rdoEnvironment 对不同使用者定义逻辑上的connections和transaction的范围,包含被开启的或未开启但拥有的connections,提供仿真transaction的机制,提供一个security context来执行data manipulation language(DML)。rdoEnvironment(0)会自动产生。 rdoConnection 代表一个连到远程资料来源的开启的connection,或是一个拥有但未开启的对象,该对象可以在稍后开启。 rdoTable 代表一个储存着的基本资料表(base table)的定义或是一个view rdoResultset 代表执行一个查询后所传回的记录 rdoColumn 代表拥有一般的资料型态以及属性的一个数据域位 rdoQuery 一个可以拥有参数的SQL查询 rdoParameter 代表输出入的参数,关联于rdoQuery对象
注意:要支持分布式交易(distributed transaction)需要搭配SQL Server6.5版以及Distributed Transction Coordinator。
注意:RDO 1.0版提供的rdoPreparedStatement对象和rdoPreparedStatements集合,在RDO 2.0版仍然支持,但是是为了向前兼容,所以在RDO 2.0版后最好改用rdoQuery对象和rdoQueries集合。
产生远程资料对象
RDO对象可以经由父对象产生或经由Dim述句。如果是经由Dim as New述句产生的RDO对象不会被加入到相关的集合中。下表列出如何产生主要的RDO对象
1.1产生远程资料对象
比较
虽然RDO与DAO大致相似,但RDO是专门操作关系型数据库的对象,且没有自己的查询处理(processor),它完全靠资料来源处理查询并产生结果集 以下是RDO与DAO/Jet 的比较表 RDO对象 相对的DAO/Jet对象 rdoEngine DBEngine DBEngeine rdoError Error Error rdoEnvironment Workspace Workspace rdoConnection Database Connection rdoTable TableDef 不支持 不支持 索引 不支持 rdoResultset Recordset Recordset 不支持 Table-type 不支持 Keyset-type Dynaset-type Dynaset-type Static-type(r/w) Snapshot-type(r/o) Snapshot-type(r/o) Dynamic-type 不支持 Dynamic-type Forward-only-type Forward-only-type Forward-only-type (cursorless) 不支持 (cursorless) rdoColumn Field Field rdoQuery QueryDef QueryDef rdoParameter Parameter Parameter 不支持 Relation 不支持 不支持 Group 不支持 不支持 User 不支持 一些DAO的对象、方法、和属性是设计来操作ISAM架构下的Jet数据库。例如可以利用索引(Index)对象和Seek方法来处理ISAM的索引以及找寻记录。但是因为RDO所使用的后端数据库处理索引的方式完全不同,所以RDO并不需要去支持这些索引的运作。 DAO也支持建造和修改数据库架构(schema),参照的完整性以及安全上的维护。这些对RDO来说都是后端数据库服务器在维护的,所以本身并不提供相关的对象或方法。 但仍然可以利用RDO的make-table查询;以标准的SQL述句来执行动作查询(action queries)以产生、修改或删除数据库和资料表。同时也可以以复杂的stored procedures还处理数据库的架构和执行为或的工作,这些是DAO做不到的。
2.1RDO的集合管理
初始化
rdoEngine对象是所有RDO对象的最上层对象。它不能被重复产生,以及使用集合来包含。它可以让好几个应用程序共享,但会为每一个参与共享的应用程序产生私有资料区,而不会让应用程序彼此之间互相干扰。
3.1初始化rdoEngine的内定值
做啥。 例如执行了一个统计的查询后,这个讯息会经由rdoErrors集合传回,而应用程序可以经由InfoMessage事件的触发而知道。
3.2处理RDO的错误和讯息
产生
在大部分的状况下并不需要产生额外的rdoEnvironment对象,内定的rdoEnvironments(0)应该够用。但若应用程序需要更多的交易处理,或不同的账号密码环境,那就需要以rdoCreateEnvironment方法给予不同的使用者名称、密码来产生另外一个rdoEnvironment对象。这时要给予一个唯一的rdoEnvironment名称,若与已经产生的相同,则会有可捕捉的错误。 内定的rdoEnvironments(0)的名称为”Default_Environment”,使用者名称及密码都是空字符串。 若提供了唯一的名子,新产生的rdoEnvironment对象会自动加入rdoEnvironments集合。反之,若以空字符串当name参数的值,则新产生的对象不会加入。 快取(cached)登入信息 若在使用OpenConnection方法时,没有在connect参数设定使用者账号密码,或是使用RemoteData控件,但未在Connect内指定,则RDO会用rdoEnvrionment的账号密码建立连结。如下例,会用使用者账号(Fred)和密码(Blond)在rdoEnvironment对象En内建立连结 Dim En As rdoEnvironment Set En = rdoCreateEnvironment(“”,”Fred”,”Blond”)
4.1使用rdoEnvironment对象管理交易(Transaction)
注意:交易模型并不支持巢状交易(nested transaction),所以不能在前一个BeginTrans还未与CommitTrans或RollbackTrans成对之前再使用一个BeginTrans方法。但若ODBC的资料源本身如SQL Server支持巢状交易,则可以透过SQL述句,叫伺服端进行巢状交易。 当使用ODBC交易时,一个开启的连结并不会影响另一个连结,即使这两个连结是连到同一个数据库的同一个资料表。 捕捉rdoEnvironment交易事件 当rdoEnvironment完成一笔交易后会引发一个事件,可以利用这个事件来管理其它的交易。
4.2在rdoEnvironment对象管理Connections
密码保护的环境。在这个环境下可以开启多条连结与管理多个ODBC交易。 l l 使用OpenConnection方法在rdoEnvironment之内建立一个以上的连结 l l 在rdoEnvironment内使用BeginTrans,CommitTrans和RollbackTrans方法来管理ODBC交易。 l l 使用多个rdoEnvironment对象来建立多个、同时、独立和重叠的交易。 l l 使用Dim X As New rdoConnection来产生一个独立(stand-alone)rdoConnection对象,接着使用Add方法加入到rdoEnvironment对象内的rdoConnections集合。 l l 使用Remove方法将特定的rdoConneciton对象从他的父集合rdoConnections中移除。 l l 使用Close方法来结束环境和连结注意:rdoConnection对象不一定要属于某个rdoEnvironment,它可以独立产生。
建立RDO连结
在参照一个远程数据库内的资料之前,要先建立一条连结到资料源。这个资料源可以是远程的数据库服务器,像MS SQL Server或Oracle,或其它支持适合的ODBC驱动程序的数据库。 RDO建立连结有好几种方法,与DAO不同的是,它并不为应用程序管理这些连结;仅仅收集要传给SQLDriverConnect函数的参数,和使用SQLDisconnect函数来关掉连结。RDO并不快取这些资料以分享给使用相同DSN来建立连结的后来者。当使用RDO的Close方法来关掉连结时,它立刻就会被关掉。 可以以下的方法开启连结 l l 使用RemoteData控件自己的Connection属性来建立连结对象rdoConnection l l 宣告一个rdoConnection对象,再以rdoEnvironment对象的OpenConnection方法开启后赋予 l l 用Dim 变量名 As New语法产生一个独立的rdoConnction,设定它的属性后再以EstablishConneciton方法建立连结 l l 无论在独立的rdoConnection或是使用过Close方法的rdoConnection都可以用EstablishConnection方法建立连结 在不同的情况下,可以选择不同的方法。例如要对一些远程数据库完成象,再透过rdoQuery对象的ActiveConnection属性将rdoConnection对象设定(Assign)给这些rdoQuery。在大部分状况下,RemoteData控件建立连结较为简单。 以上的这些方法都是要与资料源如SQL Server,或Oracle;建立一个实体的连结(link)。要建立这个连结需要提供资料源的网络位置、驱动程序型态以及一些用来确认使用者身份的选择性参数。 一但建立了连结,可以用它来 l l 使用OpenResult方法来执行一个查询以传回一或多个结果集。 l l 使用Execute方法以执行一个动作查询(action query) l l 产生一个rdoQuery对象,好接着执行参数查询或预存程序。 l l 定义执行一个以上预存程序的查询来当成rdoConnection的方法。 l l 利用rdoResultset对象的ActiveConnection属性连结rdoConnection对象 l l 使用Add方法将rdoConnection加到rdoConnections集合 l l 使用Remove方法将rdoConnection从rdoConnections集合移除
5.1提供RDO的连结字符串(ConnectionStrings)
注意:
安全漏洞。可以改成应用程序直接以某几种的账号密码登入。若要搭配NT网络系统的DOMAIN安全管理,则上述两个方法的连结字符串内的UID和PWD要保持空白。写法如下 Conn$=”DSN=MyRemote;UID=;PWD=;” 设定内定的数据库 若rdoConnection对象在建立之初,未设定DATABASE参数,则内定使用的数据库可能是注册的DSN内定义的数据库;或是伺服端系统管理员定义的数据库。但内定的数据库可以藉由执行Transaction SQL的“USE予以更改。范例如下 cn.Execute “USE Pubs” 传递连结字符串给RDO或RemoteData控件 可以以下列方式传递连结字符串给RDO或RemoteData控件 l l 执行OpenDatabase方法时,设定Connect参数。 l l 设定RemoteData控件的Connect属性。 l l 当rdoConnection使用EstablishConnection方法时,设定Connect属性 若使用RemoteData控件,则有一些属性都与连结有关,但如果Connect属性内有设,其它相关的属性也有设定的下,Connect内的属性会盖过其它的属性。
5.2使用已经注册好的DSN
sa;PWD=;''
5.3产生不用DSN的RDO连结
5.4设定rdoConnection选项
5.5使用rdoConnection对象的事件(Event)
时间间隔用完或查询结束。若输入True,则直接停掉该执行中的查询。注意:当查询查询被激活时,QueryTimeout属性就已经传给ODBC驱动程序
5.6异步地开启连结
5.7使用独立的(stand-alone)rdoConnection对象
5.8使用rdoConnection对象
数据库结构(schema),或执行管理的动作(administrative function) l l 执行预存程序来管理结果集、输出的参数或return values l l 使用rdoConnection的Close方法以停止到资料源的连结,同时释放所使用的资源。
5.9与RDO资料源连结失败
5.10使用rdoTable对象
5.11关掉不需要的RDO连结
送出查询
通常应用程序需要利用查询来完成对远程数据库资料、使用者权限或数据库伺服程序运作的管理。而查询可分为以下两部分 l l 送出一个内含SQL述句描述所需结果集的查询,或参照一个预存程序 l l 处理结果记录,参数和传回值(预存程序回传的部分) 在送出一个查询前,需要问以下的问题以确认查询的目的与效率 l l 应用程序是否需要浏览资料记录?若需要浏览,则是双向的还是祇向前浏览? l l 是否需要更新资料?如果需要,是否可以运作查询直接更改?使用者是否需要权限来修改? l l 有多少使用者会在同时,运作同样的资料?可否控制这些同时执行的应用程序?这些应用程序是否共享资料? l l 查询将会传回多少笔资料?应用程序端的系统是否有能力存放这些记录?网络使否在传这些记录时有频宽的瓶颈? l l 记录是以何种格式传回—书签还是静态资料? l l 查询是否要传参数? l l 这个查询在应用程序运作时会常常被执行,还是仅有一两次? 管理RDO查询 当开启一条连结时,可以在其上执行许多查询,可以参考下述原则使用不同形式的查询 l l 若查询仅仅使用一次,可以用rdoConnection对象的OpenResultset或Execute方法来产生rdoResultset对象,还是直接执行动作查询。这两种选项最后都会经由执行ODBC API的SQLExecDirect函式完成查询,所以可以在使用OpenResultset或Execute方法时,直接在Options参数输入rdExecDirect以直接指定SQLExecDirect函式。 l l 若执行的查询可能会使用一次以上同时要输入参数,则可以CreateQuery方法产生rdoQuery对象。该对象允许多次使用,且在使用时输入不同的参数。一但使用rdoQuery对象,则可以透过这个对象的OpenResultset或Execute方法来产生rdoResultset对象,或是直接执行动作查询。若要改变输入的参数,则可以经由改变rdoParameter对象办到。这种做法会经由ODBC API的SQLPrepare和SQLExecute函式。
6.1产生rdoResultset对象
6.2使用OpenResultset方法
注意:
6.3编写SQL述句
参考资料
远程数据对象.TechTarget SOA.
最新修订时间:2024-08-17 21:09
目录
概述
简介
参考资料