事件處理程式如何一起運作
除非您在 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 事件處理程式。 不過,如果在第一個事件處理程式中取消作業,其相關聯的 Complete 處理程式會立即以 adStatusOperationCancelled被呼叫。 永遠不會呼叫第二個處理程式。 不過,如果第一個事件處理程式允許事件繼續進行,則會呼叫其他事件處理程式。 如果作業取消,則會如先前範例所示呼叫 完成 事件。
未配對事件處理程式
只要傳遞至事件的狀態不是 adStatusCantDeny,您可以透過傳回 Status 參數中的 adStatusUnwantedEvent 來關閉任何事件的事件通知。 例如,第一次呼叫 Complete 事件處理程式時,您可以傳回 adStatusUnwantedEvent。 您接下來只會收到 Will 活動。 不過,某些事件可能會因為一個以上的原因而觸發。 在此情況下,事件會有 Reason 參數。 當您傳回 adStatusUnwantedEvent時,只有在該事件因為特定原因發生時才會停止接收該事件的通知。 換句話說,您可能會收到通知,告知每一個可能導致事件被觸發的原因。
當您想要檢查作業中使用的參數時,單一 Will 事件處理程式會很有用。 您可以修改這些作業參數或取消作業。
或者,讓 完成 事件通知啟用。 當您的第一個Will事件處理程式被呼叫時,傳回adStatusUnwantedEvent。 您隨後只會收到 完成 事件。
單一 和 完整 的事件處理程式對管理異步操作很有用。 每個非同步操作都有適當的 Complete 事件。
例如,填入大型 Recordset 物件可能需要很長的時間。 如果您的應用程式已適當撰寫,您可以啟動 Recordset.Open(...,adAsyncExecute)
操作,並繼續進行其他工作。 當 Recordset 被 ExecuteComplete 事件填滿時,您會最終收到通知。
單一事件處理程式和多個物件
Visual C++ 等程式設計語言的彈性可讓您讓一個事件處理程式處理多個物件的事件。 例如,您可能有一個 Disconnect 事件處理程式會處理來自數個 Connection 物件的事件。 如果其中一個連線結束,則會呼叫 Disconnect 事件處理程式。 您可以判斷哪個連接造成事件,因為事件處理程式對象參數會設定為對應的 Connection 物件。
注意
這項技術無法在 Visual Basic 中使用,因為該語言只能將一個物件與事件處理程式相互關聯。