此頁(yè)沒(méi)有內(nèi)容條目
內(nèi)容

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

無(wú)論是否實(shí)際使用事件,都必須執(zhí)行 ConnectionEventRecordsetEvent 類中的所有事件處理程序。必須執(zhí)行的工作量取決于所用的編程語(yǔ)言。某些語(yǔ)言,如 Microsoft Visual Basic 可以為您完成所有工作。其他語(yǔ)言如 Microsoft? Visual C++? 則需要您做所有工作。而 Microsoft? Visual J++? with ADO/WFC 則介于兩者之間,該語(yǔ)言為您處理大部分工作。詳細(xì)信息,請(qǐng)參閱不同語(yǔ)言的 ADO 事件實(shí)例。

雖然由您自己實(shí)現(xiàn)事件處理程序的工作量較大,但可以完成用 Visual Basic 這類語(yǔ)言無(wú)法進(jìn)行的工作。例如,在 Microsoft Visual C++ 中,一個(gè) RecordsetEvent 處理程序可以處理在操作多個(gè) Recordset 對(duì)象時(shí)所產(chǎn)生的通知。

Will Complete 事件處理程序可以成對(duì)或分開(kāi)使用。

成對(duì)的事件處理程序

?如下設(shè)定說(shuō)明 Will 事件成功時(shí)會(huì)出現(xiàn)什么情況。

Recordset 對(duì)象擁有成對(duì)事件 WillChangeFieldFieldChangeComplete。在應(yīng)用程序中開(kāi)始更改字段值時(shí),將調(diào)用 WillChangeField 事件處理程序;可以返回一個(gè)用于更改字段的標(biāo)志。操作完成時(shí),FieldChangeComplete 事件將通知應(yīng)用程序操作已經(jīng)結(jié)束,而事件處理程序狀態(tài)參數(shù)則報(bào)告操作成功。

?如下設(shè)定說(shuō)明 Will 事件將操作取消時(shí)會(huì)出現(xiàn)什么情況。

在同一應(yīng)用程序中,更改另一個(gè)字段。將調(diào)用 WillChangeField 事件處理程序??赡芤?yàn)槟撤N原因您決定不接受更改字段,所以您在狀態(tài)參數(shù)中返回 adStatusCancel。結(jié)果,操作未能完成。

FieldChangeComplete 事件通知您操作已經(jīng)結(jié)束。事件處理程序狀態(tài)參數(shù)被設(shè)為 adStatusErrorsOccurred;錯(cuò)誤參數(shù)引用 Error 對(duì)象,而 Error 對(duì)象的 Number 屬性被設(shè)為 ADO 值或提供者,從而指示操作已被取消。

?多個(gè) Will Complete 事件處理程序可被同一操作調(diào)用。如下設(shè)定說(shuō)明當(dāng)多個(gè) will 事件成功時(shí)會(huì)出現(xiàn)了什么情況。

Recordset 對(duì)象擁有成對(duì)事件 WillChangeField、FieldChangeCompleteWillChangeRecord RecordChangeComplete。開(kāi)始更改字段值時(shí)將調(diào)用 WillChangeField 事件處理程序;可以返回一個(gè)用于更改字段的標(biāo)志。

下一步,調(diào)用 WillChangeRecord 事件處理程序,再次指示操作應(yīng)該結(jié)束。

注意   所有從屬于 ADO 對(duì)象的特定實(shí)例的 will 事件處理程序通常都將被調(diào)用。但是,調(diào)用過(guò)程沒(méi)有特定次序。

操作結(jié)束時(shí),將調(diào)用 FieldChangeCompleteRecordChangeComplete 事件處理程序。

?多個(gè) WillComplete 事件處理程序可被同一操作調(diào)用,但是可以取消掛起的操作。如下設(shè)定說(shuō)明在多個(gè) will 事件的最后一個(gè)取消操作時(shí),將出現(xiàn)什么情況。

再一次,Recordset 擁有成對(duì)的 WillChangeField、FieldChangeComplete、WillChangeRecordRecordChangeComplete 事件。開(kāi)始更改字段值時(shí)將調(diào)用 WillChangeField 事件處理程序;可以返回一個(gè)用于更改字段的標(biāo)志。

下一步,將調(diào)用 WillChangeRecord 事件處理程序。也許您認(rèn)為字段更改本身沒(méi)有問(wèn)題,但是它將在記錄中創(chuàng)建一個(gè)整體錯(cuò)誤。您返回 adStatusCancel,指示不接受更改字段。WillChangeField 事件處理程序已經(jīng)允許進(jìn)行操作。

操作被 WillChangeRecord 事件處理程序取消,因此未能完成。調(diào)用 FieldChangeComplete 事件處理程序,將狀態(tài)參數(shù)設(shè)置為 adStatusErrorsOccurred;并對(duì)錯(cuò)誤參數(shù)進(jìn)行適當(dāng)?shù)脑O(shè)置。

下一步,RecordChangeComplete 事件處理程序被設(shè)置為 adStatusErrorsOccurred 的狀態(tài)參數(shù)調(diào)用。匹配的 Complete 事件被 will 事件調(diào)用。

?多個(gè) WillComplete 事件處理程序可被同一個(gè)操作調(diào)用,但是可以取消掛起操作。如下設(shè)定說(shuō)明當(dāng)操作被事件處理程序、而不是多個(gè) will 事件的最后一個(gè)事件取消時(shí),會(huì)出現(xiàn)什么情況。

再一次,Recordset 擁有成對(duì)的 WillChangeField、FieldChangeComplete、WillChangeRecordRecordChangeComplete 事件。在開(kāi)始更改字段值時(shí)將調(diào)用 WillChangeField 事件處理程序,返回 adStatusCancel,從而指示更改字段是不可接受的。操作沒(méi)有完成;FieldChangeComplete 事件處理程序通知您操作已經(jīng)結(jié)束,狀態(tài)和錯(cuò)誤參數(shù)設(shè)置正確。

然而,由于第一個(gè) will 事件取消操作,WillChangeRecord(還有 RecordChangeComplete)事件處理程序未被調(diào)用。通常,如果 will 事件取消操作,其他 will 事件處理程序?qū)⒉粫?huì)被調(diào)用。

不成對(duì)的事件處理程序

通過(guò)返回 status 參數(shù)的 adStatusUnwantedEvent 可以關(guān)閉任何事件的事件通知。例如,第一個(gè) Complete 事件處理程序被調(diào)用時(shí),將返回 adStatusUnwantedEvent,并且您隨后只收到 will 事件。

檢查操作中將要使用的參數(shù)時(shí),單個(gè) will 事件處理程序會(huì)很有幫助。您可以修改這些操作參數(shù)或者取消操作。

另外一種情況是,打開(kāi) Complete 事件通知,當(dāng)?shù)谝粋€(gè) will 事件處理程序被調(diào)用時(shí),返回 adStatusUnwantedEvent。您隨后將只收到 Complete 事件。

單個(gè) Complete 事件處理程序是管理異步操作的有效工具。每個(gè)異步操作都具有相應(yīng)的 Complete 事件。

例如,充填很大的 Recordset 對(duì)象要花很長(zhǎng)時(shí)間。如果應(yīng)用程序編寫恰當(dāng),則可以啟動(dòng) Recordset.Open(...,adAsyncExecute) 操作并繼續(xù)其他處理程序。最終您一定會(huì)在 ExecuteComplete 事件充填 Recordset 時(shí)收到通知。

單個(gè)事件處理程序和多個(gè)對(duì)象

Microsoft Visual C++ 這類程序語(yǔ)言的靈活性使得一個(gè)事件處理程序可以處理多個(gè)對(duì)象的事件。例如,應(yīng)用一個(gè) Disconnect 事件處理程序可以處理多個(gè) Connection 對(duì)象的事件。如果一個(gè)連接結(jié)束,Disconnect 事件處理程序即會(huì)被調(diào)用。因?yàn)槭录幚沓绦騾?shù) object 被設(shè)置到相應(yīng)的 Connection 對(duì)象,您可以判斷出引起事件的連接。

注意   因?yàn)?Visual Basic 只能使一個(gè)對(duì)象與一個(gè)事件相關(guān)聯(lián),此技術(shù)不能應(yīng)用于該語(yǔ)言。

多個(gè)事件處理程序和單個(gè)操作

要讓一個(gè) ADO 對(duì)象及其操作與多組事件相關(guān)聯(lián)是可能的,但是不太有用。例如,每次執(zhí)行專門的字段有效性編輯時(shí),可以創(chuàng)建多個(gè) WillChangeField 事件。如果字段將要更改,某個(gè) will 事件可能會(huì)使字段值的某個(gè)部分有效,而另一個(gè) will 事件則會(huì)使另一部分有效。

此技術(shù)之所以不太有用,是因?yàn)橥ㄟ^(guò)單個(gè)事件處理程序易于執(zhí)行或調(diào)用所有的編輯程序。但為了完整起見(jiàn),才在此提到它。