事件處理常式如何協同運作
除非您是在 Visual Basic 中進行程式設計,否則不論您是否實際處理所有事件,都必須實作 Connection 和 Recordset 事件的所有事件處理常式。 您必須執行的實作工作量取決於您的程式設計語言。 如需詳細資訊,請參閱依語言的 ADO 事件具現化。
配對事件處理常式
每個 Will 事件處理常式都有相關聯的 Complete 事件處理常式。 例如,當您的應用程式變更欄位的值時,會呼叫 WillChangeField 事件處理常式。 如果可接受變更,您的應用程式會讓 adStatus 參數保持不變,並執行作業。 當作業完成時,FieldChangeComplete 事件會通知您的應用程式作業已完成。 如果成功完成,adStatus 會包含adStatusOK;否則,adStatus 會包含 adStatusErrorsOccurred,您必須檢查 Error 物件來判斷錯誤的原因。
呼叫 WillChangeField 時,您可能會判斷不應該進行變更。 在此情況下,請將 adStatus 設定為adStatusCancel。作業已取消,且 FieldChangeComplete 事件會收到 adStatus 的 adStatusErrorsOccurred 值。 Error 物件包含 adErrOperationCancelled,讓 FieldChangeComplete 處理常式知道作業已取消。 不過,您必須在變更 adStatus 參數之前檢查其值,因為如果參數在進入程序時設定為 adStatusCantDeny,將 adStatus 設定為 adStatusCancel 就沒有任何作用。
有時候作業可能會引發一個以上的事件。 例如,Recordset 物件有 Field 變更和 Record 變更的配對事件。 當您的應用程式變更 Field 的值時,會呼叫 WillChangeField 事件處理常式。 如果判斷作業可以繼續,也會引發 WillChangeRecord 事件處理常式。 如果這個處理常式也允許事件繼續,就會進行變更,並呼叫 FieldChangeComplete 和 RecordChangeComplete 事件處理常式。 未定義呼叫特定作業的 Will 事件處理常式順序,因此您應該避免撰寫會依賴以特定序列呼叫處理常式的程式碼。
在引發多個 Will 事件的情況下,其中一個事件可能會取消暫止的作業。 例如,當您的應用程式變更 Field 的值時,通常會呼叫 WillChangeField 和 WillChangeRecord 事件處理常式。 不過,如果在第一個事件處理常式中取消作業,則會立即使用 adStatusOperationCancelled 呼叫其相關聯的 Complete 處理常式。 永遠不會呼叫第二個處理常式。 不過,如果第一個事件處理常式允許事件繼續進行,則會呼叫其他事件處理常式。 如果取消作業,則會呼叫這兩個 Complete 事件,如先前的範例所示。
非成對事件處理常式
只要傳遞至事件的狀態不是 adStatusCantDeny,您就可以在 Status 參數中傳回 adStatusUnwantedEvent 來關閉任何事件的事件通知。 例如,第一次呼叫 Complete 事件處理常式時,您可以傳回 adStatusUnwantedEvent。 您後續只會收到 Will 事件。 不過,某些事件可能會因為多個原因而觸發。 在此情況下,事件會有 Reason 參數。 當您傳回 adStatusUnwantedEvent 時,您只會在因為該特定原因而發生時,停止接收該事件的通知。 換句話說,您可能會收到每個可能觸發事件原因的通知。
當您想要檢查將在作業中使用的參數時,單一 Will 事件處理常式很有用。 您可以修改這些作業參數或取消作業。
或者,讓 Complete 事件通知保持啟用狀態。 呼叫第一個 Will 事件處理常式時,傳回 adStatusUnwantedEvent。 您後續只會收到 Complete 事件。
管理非同步作業時,單一 Complete 事件處理常式很有用。 每個非同步作業都有適當的 Complete 事件。
例如,填入大型 Recordset 物件可能需要很長的時間。 如果您的應用程式已適當撰寫,您可以啟動 Recordset.Open(...,adAsyncExecute)
作業並繼續其他處理。 當 Recordset 填入 ExecuteComplete 事件時,您最終會收到通知。
單一事件處理常式和多個物件
程式設計語言 (例如 Visual C++) 的彈性,可讓您使用一個事件處理常式處理多個物件的事件。 例如,您可能會有一個 Disconnect 事件處理常式處理來自數個 Connection 物件的事件。 如果其中一個連線結束,則會呼叫 Disconnect 事件處理常式。 您可以分辨哪一個連線造成事件,因為事件處理常式物件參數會設定為對應的 Connection 物件。
注意
這項技術無法在 Visual Basic 中使用,因為該語言只能讓一個物件與事件處理常式相互關聯。