事件处理程序如何共同工作

无论是否实际使用事件,都必须执行 ConnectionEventRecordsetEvent 类中的所有事件处理程序。必须执行的工作量取决于所用的编程语言。某些语言,如 Microsoft Visual Basic 可以为您完成所有工作。其他语言如 Microsoft® Visual C++® 则需要您做所有工作。而 Microsoft® Visual J++™ with ADO/WFC 则介于两者之间,该语言为您处理大部分工作。详细信息,请参阅不同语言的 ADO 事件实例

虽然由您自己实现事件处理程序的工作量较大,但可以完成用 Visual Basic 这类语言无法进行的工作。例如,在 Microsoft Visual C++ 中,一个 RecordsetEvent 处理程序可以处理在操作多个 Recordset 对象时所产生的通知。

Will Complete 事件处理程序可以成对或分开使用。

成对的事件处理程序

不成对的事件处理程序

通过返回 status 参数的 adStatusUnwantedEvent 可以关闭任何事件的事件通知。例如,第一个 Complete 事件处理程序被调用时,将返回 adStatusUnwantedEvent,并且您随后只收到 will 事件。

检查操作中将要使用的参数时,单个 will 事件处理程序会很有帮助。您可以修改这些操作参数或者取消操作。

另外一种情况是,打开 Complete 事件通知,当第一个 will 事件处理程序被调用时,返回 adStatusUnwantedEvent。您随后将只收到 Complete 事件。

单个 Complete 事件处理程序是管理异步操作的有效工具。每个异步操作都具有相应的 Complete 事件。

例如,充填很大的 Recordset 对象要花很长时间。如果应用程序编写恰当,则可以启动 Recordset.Open(...,adAsyncExecute) 操作并继续其他处理程序。最终您一定会在 ExecuteComplete 事件充填 Recordset 时收到通知。

单个事件处理程序和多个对象

Microsoft Visual C++ 这类程序语言的灵活性使得一个事件处理程序可以处理多个对象的事件。例如,应用一个 Disconnect 事件处理程序可以处理多个 Connection 对象的事件。如果一个连接结束,Disconnect 事件处理程序即会被调用。因为事件处理程序参数 object 被设置到相应的 Connection 对象,您可以判断出引起事件的连接。

注意   因为 Visual Basic 只能使一个对象与一个事件相关联,此技术不能应用于该语言。

多个事件处理程序和单个操作

要让一个 ADO 对象及其操作与多组事件相关联是可能的,但是不太有用。例如,每次执行专门的字段有效性编辑时,可以创建多个 WillChangeField 事件。如果字段将要更改,某个 will 事件可能会使字段值的某个部分有效,而另一个 will 事件则会使另一部分有效。

此技术之所以不太有用,是因为通过单个事件处理程序易于执行或调用所有的编辑程序。但为了完整起见,才在此提到它。