使用 rdoConnection 对象事件

rdoConnection 对象会触发一系列的事件过程,有了这些事件过程,对连接以及与该连接相联的查询的管理将更加简单。在以下情况会触发这些事件:

rdoConnection 事件 什么时候被触发
BeforeConnect 在调用 ODBC SQLDriverConnect 函数之前。
Connect 连接操作完成之后,无论操作的成败。
Disconnect 连接断开之后。
QueryComplete 异步查询完成之后。
QueryTimeout 在某个查询的超时时期已经超出了 rdoConnection 对象的 QueryTimeout 属性之后。
WillExecute RDO 试图执行这些查询之前。

所有执行于相联的 rdoConnection 上的查询都会触发 QueryComplete, QueryTimeout 以及 WillExecute 事件。这也包括通过 OpenResultset 或 Execute 方法执行的那些查询,以及从相关联的 rdoQuery 对象执行的查询。Query 参数是一个对象引用,表明哪次查询触发了该事件。使用这个参数,该连接上的所有查询之需要写一个事件处理程序,但是,仍然要为特定查询定制处理程序。当执行对 rdoConnection 对象本身的查询时,RDO 将在内部创建了一个 rdoQuery 对象,而且,这个内部 rdoQuery 的引用将作为 Query 参数传递。

使用 BeforeConnect 事件处理程序

BeforeConnect 事件提供了改变正被传递到 ODBC SQLDriverConnect 函数的连接字符串的机会。在代码中可以添加原先没有提供的工作站 ID 或其它参数。通过筛选这些连接参数,可以防止用户浏览未授权的数据源或用户名。

使用 Connect 事件处理程序

Connect 事件的作用是:让代码知道什么时候完成对于特定连接对象的连接操作,就是说,该事件无论连接操作成功与否都会触发。每一个 rdoConnection 对象都可以通过宣称,显示这个事件以及与连接有关的其它所有事件。

在连接时间较长的情况下,Connect 事件尤其有用,例如在广域网上。在使用 OpenConnection 或者 EstablishConnection 方法的 rdAsyncEnable 选项时,推荐使用该事件,而不要去轮询 rdoConnection 对象的 StillConnecting 属性。如果连接操作失败,ErrorOccurred 参数将设为 True。这时,代码需要检查 rdoErrors 集合,以确定失败的原因。

使用 QueryComplete 事件处理程序

在使用异步查询时,必须为 QueryComplete 事件设置一个事件处理程序,该事件在查询完成时被触发。它是对整个连接建立的,因此该连接上的所有查询都会触发同样的 QueryComplete 事件。

尽管绝大多数的 ODBC 驱动程序不支持同时执行多个的操作,支持的也不是没有,因此,QueryComplete 事件处理程序必须能够知道已经完成的查询是哪一个。QueryComplete 事件把一个对象引用传递到 rdoQuery,从而可以知道该查询的名称和其它属性。如果查询未能建立连接,ErrorOccurred 参数将设为 True。这时,代码必须检查 rdoErrors 集合,以确定失败的原因。

使用 QueryTimeout 事件处理程序

并非所有的查询都会立即完成,有的甚至几分钟内都不能完成。但是,除非设置 QueryTimeout 属性表明该查询所期望的执行秒数,否则 QueryTimeout 事件会在设定的时间后被触发,缺省的时间为 30 秒。如果代码将 QueryTimeout 事件的 Cancel 参数设置为 False,RDO 将使用 QueryTimeout 属性中的秒数重新启动查询超时时钟。这个特性在广域网上尤其有用,在广域网上,不能保证总用相同的时间执行查询。

注意   在一个查询开始时,QueryTimeout 属性被传递到 ODBC 驱动程序,所以对它的修改只会对下一次查询产生影响。

使用 WillExecute 事件处理程序

该事件触发于执行一个查询之前,无论是动作查询还是返回行的查询。可以捕获这个事件,以禁止执行某些特殊查询,或者对 SQL 字符串作最后的调整。

Cancel 参数用来禁止查询。例如,可以预视该查询,以确认 WHERE 子句是足够的,从而避免权全表扫描 (table scan)。另外,可能希望禁止用户既不提供姓也没有街道地址,只用 "Smith" 对客户进行查询。Cancel 参数的缺省值为 False,但如果将其设为 True 的话,该查询将不会执行,RDO 将产生一个可以捕获的错误,表明该查询被取消。

WillExecute 事件的一个很重要的功能是:可以用自己的代码对操作进行更改。就是说,可以执行一系列自己的操作,包括存储过程在内,来完成需要的功能。例如,如果远程数据库只允许通过存储过程执行更新,那么,可以捕获该事件,执行特定的参数化存储过程来执行更新,然后用 Cancel 参数取消原来需要执行的自动操作。