选择一个 RDO 游标库

RDO 支持几种不同的游标库,其中每一种都有其特定的作用。并非每个游标库都支持所有类型的游标,但是所有的库都支持只能向前的结果集管理。例如,ODBC 客户端驱动程序就只能支持 rdOpenStatic 和 rdOpenForwardOnly 游标类型,而 SQL Server 服务器端的驱动程序可以支持所有的四种类型的游标。

在使用某些 RDO 功能时,正确地选择游标库是很重要的。例如,必须使用客户端的批处理库或者 BatchUpdate 方法来创建分离的 rdoResultset 对象。要禁止游标的创建,并使用只能向前的、只读的或单行的结果集,请使用 rdUseNone 选项。

在创建独立的 rdoQuery 对象的时候,如果该对象的查询作为方法使用,必须在查询执行之前设置 CursorType,因为没有选项可以在执行查询时做这件事。

CursorType 属性值被用作 OpenResultset 方法的 type 参数。为了选择游标驱动程序的类型,需要设置 rdoEngine 的 rdoDefaultCursorDriver 属性或者设置 rdoEnvironment 或 rdoConnection 对象的 CursorDriver 属性。下表描述了这些属性的可用选项。

选项 描述
rdUseODBC RDO 将使用 ODBC 游标库。这可以大大提高小型结果集的性能,但是结果集越大,性能降低得越厉害。
rdUseServer RDO 使用服务器端的游标,如果它们是可用的。
rdUseClientBatch RDO 使用客户端的批游标库。
rdUseIfNeeded (缺省) ODBC 驱动程序选择适当类型的游标,如果可用的话,使用服务器端的游标。
rdUseNone RDO 创建一个无游标的结果集。

使用 ODBC 游标库

ODBC 游标库是所有库中最简单的。它仅仅支持静态的和只能向前的游标,因此对于许多开发者都具有不能满足要求的。对于创建几百行以上的游标来说,它也不是十分有效的。但是,它是最具灵活性的,因为它可以有效地访问所有的 ODBC 驱动程序,即便是那些不完全遵循 ODBC Level II 的驱动程序。

由 ODBC 游标库实现的静态游标只将选定的数据复制到工作站上而已。

注意   使用 ODBC 游标库时,不能执行仅仅返回一个 Binary Large Object (BLOB) 数据列的存储过程。但可以用 ODBC 游标驱动程序执行查询返回 BLOB 列和另外一个数据列。Microsoft SQL Server 服务器端的游标库没有这种局限性。

使用 rdUseIfNeeded 游标库选项

CursorDriver 属性选项告诉 RDO:如果可行的话,选择服务器端的游标。因为它是缺省选项,就意味者,如果连接到 Microsoft SQL Server 上,RDO 将选择服务器端的游标。如果与 Oracle 或其它 ODBC 数据源相联,则使用 ODBC 游标库。

使用服务器端的游标库

如果数据源支持客户端的游标,而且选择了 rdUseServer CursorDriver 选项,那么远程数据库引擎会在服务器上建立游标键集,并扩展 SQL 方言,以支持用游标创建和管理数据。Microsoft SQL Server 6.0 及其更高级的版本支持服务器端的游标,但并非所有数据源都支持。

服务器端的游标减少了对客户机上的内存和磁盘空间的需求量。但是负担转移到了服务器上。对于 SQL Server 而言,游标键集保存在服务器的 TempDB 数据库中,因此,它必须能够调整大小,以满足多个客户产生的附加的临时游标键集。

服务器端的事务 SQL 游标

另一种办法是:使用 SQL Server 自己的 Transact SQL 函数,实现服务器端的游标,增强 SQL Server 的功能。通过这些函数,可以创建一个服务器端的游标,定位到指定数据行,执行定位更新。'

服务器端的游标和多结果集查询

如果使用服务器端的游标库将包含多个 SELECT 语句的查询提交到 SQL Server,ODBC 驱动程序将拒绝该查询,因为它无法处理这种情况。如果必须执行多结果集的查询或包含多个 SELECT 语句的存储过程,可以采取下面几种办法:

使用客户批游标库

RDO 2.0 引入了 客户批处理游标库。该库可以创建只能向前的结果集除外的所有类型的游标。另外,在它的设计中使用了 Microsoft 专有的 Rushmore 技术,因此它比 ODBC 游标库要有效得多。用这个库也可以创建分离的 rdoResultset 对象,执行脱机修改数据,将 rdoResultset 与一个活动的连接重新相联,从而将更新传回使用开放式批更新的数据库。即便没有创建分离的 rdoResultset,仍然可以使用 BatchUpdate 方法来提交数据库批更新。

客户批处理游标库还可以创建客户端的所有游标。就是说,原始行的行映像和键集都被置于客户系统中。

使用 rdUseNone 游标库

CursorDriver 属性告诉 RDO 取消游标的创建,只创建一个单行的、只能向前的、只读的结果集。

并非所有的查询都需要以游标的形式返回。事实上,游标是取得数据的特别昂贵的一种方法,在产品级的应用程序中极少使用它。如果将 rdoDefaultCursorDriver 属性设置为 rdUseNone,那么应用程序创建的所有结果集都都相当于设置了如下选项:使用 OpenResultset 方法,设置了 rdOpenForwardOnly 和 rdConcurReadOnly 选项,并将 RowsetSize 设为 1。这是多数应用程序可用的最有效的结果集,因为它实现起来最简单。但是它所具备的功能也是最少的,而这也可能是某些应用程序恰恰需要的。考虑到这种方法的有效性,也许有必要让应用程序放弃豪华的游标。