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 事件提供了改变正被传递到 ODBC SQLDriverConnect 函数的连接字符串的机会。在代码中可以添加原先没有提供的工作站 ID 或其它参数。通过筛选这些连接参数,可以防止用户浏览未授权的数据源或用户名。
Connect 事件的作用是:让代码知道什么时候完成对于特定连接对象的连接操作,就是说,该事件无论连接操作成功与否都会触发。每一个 rdoConnection 对象都可以通过宣称,显示这个事件以及与连接有关的其它所有事件。
在连接时间较长的情况下,Connect 事件尤其有用,例如在广域网上。在使用 OpenConnection 或者 EstablishConnection 方法的 rdAsyncEnable 选项时,推荐使用该事件,而不要去轮询 rdoConnection 对象的 StillConnecting 属性。如果连接操作失败,ErrorOccurred 参数将设为 True。这时,代码需要检查 rdoErrors 集合,以确定失败的原因。
在使用异步查询时,必须为 QueryComplete 事件设置一个事件处理程序,该事件在查询完成时被触发。它是对整个连接建立的,因此该连接上的所有查询都会触发同样的 QueryComplete 事件。
尽管绝大多数的 ODBC 驱动程序不支持同时执行多个的操作,支持的也不是没有,因此,QueryComplete 事件处理程序必须能够知道已经完成的查询是哪一个。QueryComplete 事件把一个对象引用传递到 rdoQuery,从而可以知道该查询的名称和其它属性。如果查询未能建立连接,ErrorOccurred 参数将设为 True。这时,代码必须检查 rdoErrors 集合,以确定失败的原因。
并非所有的查询都会立即完成,有的甚至几分钟内都不能完成。但是,除非设置 QueryTimeout 属性表明该查询所期望的执行秒数,否则 QueryTimeout 事件会在设定的时间后被触发,缺省的时间为 30 秒。如果代码将 QueryTimeout 事件的 Cancel 参数设置为 False,RDO 将使用 QueryTimeout 属性中的秒数重新启动查询超时时钟。这个特性在广域网上尤其有用,在广域网上,不能保证总用相同的时间执行查询。
注意 在一个查询开始时,QueryTimeout 属性被传递到 ODBC 驱动程序,所以对它的修改只会对下一次查询产生影响。
该事件触发于执行一个查询之前,无论是动作查询还是返回行的查询。可以捕获这个事件,以禁止执行某些特殊查询,或者对 SQL 字符串作最后的调整。
Cancel 参数用来禁止查询。例如,可以预视该查询,以确认 WHERE 子句是足够的,从而避免权全表扫描 (table scan)。另外,可能希望禁止用户既不提供姓也没有街道地址,只用 "Smith" 对客户进行查询。Cancel 参数的缺省值为 False,但如果将其设为 True 的话,该查询将不会执行,RDO 将产生一个可以捕获的错误,表明该查询被取消。
WillExecute 事件的一个很重要的功能是:可以用自己的代码对操作进行更改。就是说,可以执行一系列自己的操作,包括存储过程在内,来完成需要的功能。例如,如果远程数据库只允许通过存储过程执行更新,那么,可以捕获该事件,执行特定的参数化存储过程来执行更新,然后用 Cancel 参数取消原来需要执行的自动操作。