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

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

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

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

成对的事件处理程序

?如下设定说明 Will 事件成功时会出现什么情况。

Recordset 对象拥有成对事件 WillChangeFieldFieldChangeComplete。在应用程序中开始更改字段值时,将调用 WillChangeField 事件处理程序;可以返回一个用于更改字段的标志。操作完成时,FieldChangeComplete 事件将通知应用程序操作已经结束,而事件处理程序状态参数则报告操作成功。

?如下设定说明 Will 事件将操作取消时会出现什么情况。

在同一应用程序中,更改另一个字段。将调用 WillChangeField 事件处理程序。可能因为某种原因您决定不接受更改字段,所以您在状态参数中返回 adStatusCancel。结果,操作未能完成。

FieldChangeComplete 事件通知您操作已经结束。事件处理程序状态参数被设为 adStatusErrorsOccurred;错误参数引用 Error 对象,而 Error 对象的 Number 属性被设为 ADO 值或提供者,从而指示操作已被取消。

?多个 Will Complete 事件处理程序可被同一操作调用。如下设定说明当多个 will 事件成功时会出现了什么情况。

Recordset 对象拥有成对事件 WillChangeFieldFieldChangeCompleteWillChangeRecord RecordChangeComplete。开始更改字段值时将调用 WillChangeField 事件处理程序;可以返回一个用于更改字段的标志。

下一步,调用 WillChangeRecord 事件处理程序,再次指示操作应该结束。

注意   所有从属于 ADO 对象的特定实例的 will 事件处理程序通常都将被调用。但是,调用过程没有特定次序。

操作结束时,将调用 FieldChangeCompleteRecordChangeComplete 事件处理程序。

?多个 WillComplete 事件处理程序可被同一操作调用,但是可以取消挂起的操作。如下设定说明在多个 will 事件的最后一个取消操作时,将出现什么情况。

再一次,Recordset 拥有成对的 WillChangeFieldFieldChangeCompleteWillChangeRecordRecordChangeComplete 事件。开始更改字段值时将调用 WillChangeField 事件处理程序;可以返回一个用于更改字段的标志。

下一步,将调用 WillChangeRecord 事件处理程序。也许您认为字段更改本身没有问题,但是它将在记录中创建一个整体错误。您返回 adStatusCancel,指示不接受更改字段。WillChangeField 事件处理程序已经允许进行操作。

操作被 WillChangeRecord 事件处理程序取消,因此未能完成。调用 FieldChangeComplete 事件处理程序,将状态参数设置为 adStatusErrorsOccurred;并对错误参数进行适当的设置。

下一步,RecordChangeComplete 事件处理程序被设置为 adStatusErrorsOccurred 的状态参数调用。匹配的 Complete 事件被 will 事件调用。

?多个 WillComplete 事件处理程序可被同一个操作调用,但是可以取消挂起操作。如下设定说明当操作被事件处理程序、而不是多个 will 事件的最后一个事件取消时,会出现什么情况。

再一次,Recordset 拥有成对的 WillChangeFieldFieldChangeCompleteWillChangeRecordRecordChangeComplete 事件。在开始更改字段值时将调用 WillChangeField 事件处理程序,返回 adStatusCancel,从而指示更改字段是不可接受的。操作没有完成;FieldChangeComplete 事件处理程序通知您操作已经结束,状态和错误参数设置正确。

然而,由于第一个 will 事件取消操作,WillChangeRecord(还有 RecordChangeComplete)事件处理程序未被调用。通常,如果 will 事件取消操作,其他 will 事件处理程序将不会被调用。

不成对的事件处理程序

通过返回 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 事件则会使另一部分有效。

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