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 Level II 的驱动程序。
由 ODBC 游标库实现的静态游标只将选定的数据复制到工作站上而已。
注意 使用 ODBC 游标库时,不能执行仅仅返回一个 Binary Large Object (BLOB) 数据列的存储过程。但可以用 ODBC 游标驱动程序执行查询返回 BLOB 列和另外一个数据列。Microsoft SQL Server 服务器端的游标库没有这种局限性。
CursorDriver 属性选项告诉 RDO:如果可行的话,选择服务器端的游标。因为它是缺省选项,就意味者,如果连接到 Microsoft SQL Server 上,RDO 将选择服务器端的游标。如果与 Oracle 或其它 ODBC 数据源相联,则使用 ODBC 游标库。
如果数据源支持客户端的游标,而且选择了 rdUseServer CursorDriver 选项,那么远程数据库引擎会在服务器上建立游标键集,并扩展 SQL 方言,以支持用游标创建和管理数据。Microsoft SQL Server 6.0 及其更高级的版本支持服务器端的游标,但并非所有数据源都支持。
服务器端的游标减少了对客户机上的内存和磁盘空间的需求量。但是负担转移到了服务器上。对于 SQL Server 而言,游标键集保存在服务器的 TempDB 数据库中,因此,它必须能够调整大小,以满足多个客户产生的附加的临时游标键集。
另一种办法是:使用 SQL Server 自己的 Transact SQL 函数,实现服务器端的游标,增强 SQL Server 的功能。通过这些函数,可以创建一个服务器端的游标,定位到指定数据行,执行定位更新。'
如果使用服务器端的游标库将包含多个 SELECT 语句的查询提交到 SQL Server,ODBC 驱动程序将拒绝该查询,因为它无法处理这种情况。如果必须执行多结果集的查询或包含多个 SELECT 语句的存储过程,可以采取下面几种办法:
RDO 2.0 引入了 客户批处理游标库。该库可以创建只能向前的结果集除外的所有类型的游标。另外,在它的设计中使用了 Microsoft 专有的 Rushmore 技术,因此它比 ODBC 游标库要有效得多。用这个库也可以创建分离的 rdoResultset 对象,执行脱机修改数据,将 rdoResultset 与一个活动的连接重新相联,从而将更新传回使用开放式批更新的数据库。即便没有创建分离的 rdoResultset,仍然可以使用 BatchUpdate 方法来提交数据库批更新。
客户批处理游标库还可以创建客户端的所有游标。就是说,原始行的行映像和键集都被置于客户系统中。
CursorDriver 属性告诉 RDO 取消游标的创建,只创建一个单行的、只能向前的、只读的结果集。
并非所有的查询都需要以游标的形式返回。事实上,游标是取得数据的特别昂贵的一种方法,在产品级的应用程序中极少使用它。如果将 rdoDefaultCursorDriver 属性设置为 rdUseNone,那么应用程序创建的所有结果集都都相当于设置了如下选项:使用 OpenResultset 方法,设置了 rdOpenForwardOnly 和 rdConcurReadOnly 选项,并将 RowsetSize 设为 1。这是多数应用程序可用的最有效的结果集,因为它实现起来最简单。但是它所具备的功能也是最少的,而这也可能是某些应用程序恰恰需要的。考虑到这种方法的有效性,也许有必要让应用程序放弃豪华的游标。