-
vb.net教程之Rdo对象模型
远程数据对象提供了一系列的对象,用来满足远程数据库访问的特殊要求。在ODBC API和驱动程序管理器之上,RDO实现了很薄的一个代码层,用来连接、创建结果集和游标,并且使用尽可以少的工作站资源执行复杂的过程。如果代码创建了ODBCDirect Workspace对象,那么RDO也被DAO访问,这在上一节中已经介绍过了。
利用RDO,应用程序不需要使用本地的查询处理程序即可访问ODBC数据源。这意味着,在访问远程数据库引擎时,可以获得更好的性能与更大的灵活性。
通过使用RDO,可以创建简单的无游标结果集或更复杂的游标;可以执行查询并处理任意数量的结果集;可以执行包括数据操作或数据定义运算在内的动作查询;可以限制返回或处理的数据行数;还可以在不妨碍执行查询的情况下,监视远程数据资源产生的所有信息和错误;RDO还支持同步、异步或事件驱动的异步处理,因此,即使在执行冗长的查询或重新定位当前指针时,应用程序也不会被阻塞。
RDO对象和集合的属性描述了数据库部件的特征,也描述了用来操纵它们的方法。在此总体框架下,可以在对象和集合之间建立联系,这些联系表示了数据库系统的逻辑结构。RDO的对象模型如图所示:
除了rdoEngine对象外,每个对象都保存在一个相关的集合中。在首次访问实初始化RDO时,RDO自动创建一个rdoEngine和缺省的rdoEnvironments(0)实例。
远程数据对象编程模式与数据访问对象(DAO)编程模式在很多方面类似。但它的重点集中在处理存储过程及其结果集上,而不是仅用在ISAM编程模式的数据访问检索方法上。下面逐一介绍RDO对象模型中的各个对象。
1.RdoEngine对象
这个对象是RDO对象模型中最基本的对象。在应用程序的第一次访问RDO时,自动创建rdoEngine对象。这个对象不能由用户显式地创建或声明。RdoEngine对象和DAO的DBEngine对象类似。
2.RdoError对象
RdoError对象用于处理RDO所产生的所有的ODBC错误和消息,当错误发生时,这个对象自动被创建。RdoError对象和DAO的Error对象类似。
3.RdoEnvironment对象
RdoEnvironment对象为特定的用户名定义了连接及事务作用域的一个逻辑集合。包括打开的和分配的(但未打开)连接,提供了并发事务的机制,并且为数据库的数据操作语言(DML)提供了安全的上下文,在应用程序第一次访问RDO时,自动创建了一个RdoEnvironment对象并把它加到RdoEnvironments集合中,用RdoEnvironment(0)来引用它。这个RdoEnvironment对象是缺省的对象,也可以在程序中显式地创建RdoEnvironment对象,如果程序中没有另外创建新的RdoEnvironment对象,应用程序使用RdoEnvironments(0)。
用rdoEngine的rdoCreateEnvironment方法来创建一个新的RdoEnvironment对象:
var=rdoEngine.RdoCreateEnvironment(Name,UserName,Password)
其中Name参数是RdoEnvironment对象的名字,UserName和Password参数分别是连接ODBC数据源的用户名和密码。它们是RdoEnvironment对象的属性。
RdoEnvironment对象和DAO的Workspace对象类似。
4.RdoConnection对象
RdoConnection对象表示远程数据源和该数据源上特定的数据库之间打开的一个连接,或者是一个已分配但仍未连接的对象,该对象可用于随后建立的一个连接。
可以用RdoEnvironment对象的OpenConnection方法来创建一个RdoConnection对象并建立一个连接。
Connection=rdoEnvironment.OpenConnection(dsname[,prompt[,readonly[,connect[options]]]])
RdoConnection对象和DAO的Connection对象类似,因此,上面这个方法的参数含义和前面介绍的一样。
例如,下面的语句展示了应用程序和数据源WorkDB建立一个连接,连接时提示用户输入用户名和密码:
以上讲的都是有DSN的连接,用RDO还可以创建没有DSN的连接。创建没有DSN的连接可以简化客户应用程序的设置和安装、加快连接速度、提高安全性。创建没有DSN的连接时,必须把OpenConnection的dsName参数设置为空串,而且在Connect串中,DSN参数必须在SERVER和DRIVER参数之后。例如下面的语句创建一个没有DSN的连接:
RdoConnection对象和dao的Database类似。
5.RdoTable对象
RdoTable对象表示一个基本表或SQL视图的存储定义。使用这个对象可以管理数据库的结构。当已经和数据源建立了连接之后,数据源中的每个基本表或SQL视图都成为一个RdoTable对象而加入到RdoTables集合中。添加表、删除表或修改表的结构就是对RdoTable对象的操作,如下面代码列出了数据源中的所有表的名字:
6.RdoResultset对象
RdoResultset对象表示运行一个查询所产生的数据行。这个对象是RDO编程中最常用的对象。当执行一次查询时,查询结果就放在结果集中。一个结果集可以包含数据库中一个或多个表中的字段。根据游标类型的不同,可以有4种不同类型的RdoResultset对象:
(1)记录只能向前移动的结果集(Forward Only)。在这种结果集中,每一行数据都能访问到,但是记录移动只能使用MoveNext方法来从前往后移动。
(2)静态类型的结果集(Static-Type)。它可以用来查找数据或产生报表的记录的一个静态拷贝。如果数据源能够修改,那么静态结果集也能被修改。
(3)键集(Keyset-Type)类型的结果集。这种结果集可以包含可修改的行,在这种结果集中移动是不受限制的。这种结果集可以动态地添加、修改和删除记录。它的成员是固定的。
(4)动态类型的结果集(Dynamic-Type).这种结果集可以包含可修改的行,可以动态地添加、修改和删除记录,而且,它的成员是不固定的。
可以用rdoQuery对象或rdoConnection对象的OpenResultset方法来创建一个RdoResultset对象。
在创建了RdoResultset之后,就可以访问其中的数据了。在处理结果集时,需要注意以下几点:
(1)如果该结果集以游标的形式创建,必需尽快将结果置入结果集,因为游标所取得的数据行和页可能被远程数据库引擎锁定。直到定位到最后一行时该结果集才算完成置入。
(2)在很多情况下,无游标的结果集更为有效。RdoResultset对象的功能以满足需求为宜,不要具有多余的特性。例如,如果并不需要使用游标修改数据,就不要请求允许更新的结果集。如果仅仅要置入到一个列表框中,可以任意滚动的游标也是不必要的。
(3)考虑使用无游标的结果集和动作查询来执行更新。在很多情况下,这种方法能够提高性能。尽管实现起来更复杂一些,在不能直接访问基本数据时,可以采用这种方法。
(4)尽可能地使用异步操作和事件过程,以避免应用程序被锁死,至少能够减少这种可能性。也可以异步处理Move方法,例如使用MoveLast,防止在置入到结果集时被锁死。
(5)复杂的结果集处理创建几个小的结果集,这常常会使速度更快,而且可以更好地管理系统资源。
(6)尽可能从存储过程产生结果集,因为这样可以提高服务器、网络和工作站的效率,并使应用程序的开发更为简单。
(7)从连接上断开已有的,以客户端的批处理游标的形式创建的RdoResultset对象。可以继续使用Edit或AddNew方法修改数据。当准备将所作的修改传回数据库时,可以将其ActiveConnection对象设置为一个打开的rdoConnection对象,从而将RdoResultset关联到一个打开的连接上。
RdoResultset对象和DAO的Recordset对象类似。
7.RdoQuery对象
RdoQuery对象是一个查询SQL定义,可以包括0个或多个参数。可以用rdoConnection对象的CreateQuery方法来创建一个新查询,如:
8.Rdocolumn对象
Rdocolumn对象表示具有公共数据类型和公共属性的一系列数据。这个对象是rdoTable、rdoQuery、rdoResultset对象的子对象。可以使用该对象的"Value"属性来访问某一列的值,也可以使用该对象的"Type"属性或"Size"属性来修改数据库中表的结构。
Rdocolumn对象和DAO的Field对象相似。
9.RdoParameter对象
RdoParameter对象对象表示与rdoQuery对象关连的一个参数。查询参数可以是输入、输出或输入输出参数。这个对象在进行带参数查询时自动创建。可以用rdoParameter对象的"Direction"属性来设置参数类型:输入参数(rdParamReturn Value)。例如下面的代码执行一个带有4个参数的SQL语句。
10.RdoPrepareStatement对象
这个对象预先定义了一个查询。它已经过时,只是为了保持与以前的RDO版本兼容才保留这个对象。在RDO2.0之后,应该使用rdoQuery对象。