事件处理程序如何协同工作
除非在 Visual Basic 中进行编程,否则 连接 和 Recordset 事件的所有事件处理程序都必须实现,而不考虑是否实际处理所有事件。 必须执行的实现工作量取决于编程语言。 有关详细信息,请参阅 按语言 ADO 事件实例化。
配对事件处理程序
每个 Will 事件处理程序都有一个关联的 完整 事件处理程序。 例如,当应用程序更改字段的值时,将调用 WillChangeField 事件处理程序。 如果更改是可以接受的,则应用程序将保留 adStatus 参数不变,并执行该操作。 操作完成后,FieldChangeComplete 事件通知应用程序操作已完成。 如果成功完成,adStatus 将包含 adStatusOK;否则,adStatus 将包含 adStatusErrorsOccurred,您必须检查 错误 对象以确定错误原因。
当调用 WillChangeField 时,你可能会确定不应进行更改。 在这种情况下,请将 adStatus 设置为 adStatusCancel。 取消操作,FieldChangeComplete 事件接收 adStatus 值为 adStatusErrorsOccurred。 错误 对象包含 adErrOperationCancelled,以便 FieldChangeComplete 处理程序能够知道操作已被取消。 但是,在更改 adStatus 参数之前,您需要检查它的值,因为如果该参数在进入过程时被设置为 adStatusCantDeny,则将 adStatus 设置为 adStatusCancel 是无效的。
有时,操作可能会引发多个事件。 例如,Recordset 对象已为 字段 更改和 记录 更改成对事件。 当应用程序更改 字段的值时,将调用 WillChangeField 事件处理程序。 如果确认操作可以继续,则也会触发 WillChangeRecord 事件处理程序。 如果此处理程序还允许事件继续,则会进行更改,并调用 FieldChangeComplete 和 RecordChangeComplete 事件处理程序。 未定义调用特定操作的 Will 事件处理程序的顺序,因此应避免编写依赖于特定序列中调用处理程序的代码。
在多个 Will 事件被引发的情况下,其中一个事件可能会取消挂起的操作。 例如,当应用程序更改 Field的值时,通常会调用 WillChangeField 和 WillChangeRecord 事件处理程序。 但是,如果在第一个事件处理程序中取消了该操作,则会立即使用 adStatusOperationCancelled调用其关联的 Complete 处理程序。 第二个处理器从未被调用。 但是,如果第一个事件处理程序允许事件继续,将调用其他事件处理程序。 如果它随后取消了该操作,完成 事件都将像之前的例子那样被调用。
未匹配事件处理程序
只要传递给事件的状态不是 adStatusCantDeny,可以通过在 Status 参数中返回 adStatusUnwantedEvent 来关闭任何事件的通知。 例如,首次调用 Complete 事件处理程序时,可以返回 adStatusUnwantedEvent。 随后只会收到 Will 事件。 但是,某些事件可能由于多个原因而触发。 在这种情况下,该事件将具有 Reason 参数。 当您返回 adStatusUnwantedEvent时,只有在事件因那个特定原因发生时,您才会停止收到该事件的通知。 换句话说,针对每个可能触发事件的原因,您都可能会收到通知。
如果要检查操作中使用的参数,单个 将 事件处理程序非常有用。 可以修改这些操作参数或取消操作。
或者,将 “完成” 事件通知保持启用状态。 当第一个 Will 事件处理程序被调用时,返回 adStatusUnwantedEvent。 随后将只收到 完成 事件。
单个 完成 事件处理程序可用于管理异步操作。 每个异步操作都有适当的 完成 事件。
例如,填充大型 Recordset 对象可能需要很长时间。 如果应用程序编写得当,可以启动 Recordset.Open(...,adAsyncExecute)
操作并继续处理其他处理。 您最终会收到通知,当 ExecuteComplete 事件填充 Recordset 时。
单个事件处理程序和多个对象
像Visual C++这样的编程语言的灵活性使你能够使用一个事件处理程序来处理来自多个对象的事件。 例如,您可以让一个 Disconnect 事件处理程序来处理来自多个 Connection 对象的事件。 如果其中一个连接已结束,将调用 Disconnect 事件处理程序。 可以判断哪个连接导致了该事件,因为事件处理程序对象参数将设置为相应的 Connection 对象。
注意
此方法不能在 Visual Basic 中使用,因为该语言只能将一个对象与事件处理程序相关联。