与 RDO 1.0 相比,RDO 2.0 支持更多的异步操作。例如,以下所有的操作都将允许使用 rdAsyncEnable 选项:
为了更好地支持异步操作,RDO 支持以下两种属性,它们可以用来轮询异步操作的完成情况:
另外,RDO 还显露了 rdoConnection 对象的一些事件,它们在操作完成时被触发。
应用程序将查询提交到远程服务器之后,通常无法确定需要多长时间才能返回第一行数据。由于 SQL Server 和其它服务器处理结果集的方式,应用程序在满足下列条件之前将无法得到结果:
一个查询需要的时间可能是几个毫秒,也可能多达到数小时,如果在服务器完成工作之前服务器或工作站资源被耗尽,那么它将永远也不能完成。有时远程服务器相当迅速地开始将数据行传回,同时 RDO 开始根据选定的游标类型置入到 rdoResultset 。但是,远程服务器经常会停止工作,等待应用程序向前移动游标,访问数据行。在很多情况下,数行或整页的数据被锁定在服务器上,直到查询完成,这只有置入了 rdoResultset 的最后一行之后,这才可能发生。为此,需要使用一种 Move 方法,如 MoveLast,或者引用 RowCount 属性。
由于这种不确定性,在执行查询的时候,有必要预防应用程序被阻塞,并确保应用程序尽快完成结果集的置入。除非设置 OpenResultset 方法的 rdAsyncEnable 选项使异步操作有效,否则,在 ODBC 驱动程序返回结果集的第一行数据之前,应用程序将被阻塞。
除了设置 rdAsyncEnable 选项以外,还可以编写一个事件处理程序,用来捕获查询完成时发生的 QueryComplete 事件。
如果使用 OpenResultset 方法的 rdAsyncEnable 选项,RDO 将立即把控制返回到应用程序。这时,rdoResultset 对象被实例化了,但其行集合却还不能付诸使用,需要等到远程服务器开始传回数据行。为了表明状态的变化,在第一行返回之前,StillExecuting 属性将返回 True。一旦 StillExecuting 返回 False,rdoResultset 数据就是可用的,并触发 QueryComplete 事件。
使用了异步操作选项之后,当远程服务器忙于执行查询或置入到结果集时,应用程序会得到控制权。因为该操作可能要化费一定的时间才能完成,所以必须确定在这一段时间内应用程序需要做些什么。下面的建议将有助于选择可行的策略:
下图说明了如何建立异步文件导入例程。
图 11.2 在等待异步操作时,运行交替的过程
这种方法既推动了在远程服务器上执行查询的线程,也加速了工作站上的有效线程。
只要异步操作还在执行,那么除了下表所列的属性和方法之外,不能再去引用正在被处理的 rdoResultset, rdoQuery 或 rdoConnection 等对象。
在异步操作期间有效的属性和方法
远程数据对象 | 有效的属性和方法 |
rdoConnection | StillConnecting 属性;Cancel, Close 方法 |
rdoQuery | StillExecuting 属性;Cancel, Close 方法 |
rdoResultset | StillExecuting 属性;Cancel, Close 方法 |
如果确认等待一个异步操作的时间太长,可以用 Cancel 或 Close 方法通知远程处理器放弃该操作。
在提交了一个复杂的多语句的查询,或大范围的更新操作时,使用这两种方法都是不太谨慎的,因为数据库的完整性可能会遭到破坏。