2016-09-14 36 views
2

我試圖在連接到SQL Server後端的Access應用程序中設置錯誤處理,以防止Access將空主鍵傳遞給服務器。我基於Properly Handling Errors in VBA (Excel)爲什麼'On Error'總是觸發,就好像密鑰爲空?

我的代碼中使用更新前和代碼

假設如果用戶設置S_ID爲空(或創建一個新的記錄時,離開它爲空)來運行ErrHandler代碼。但是它總是運行ErrHandler代碼。

Private Sub S_ID_BeforeUpdate(Cancel As Integer) 

Dim trigger As Integer 

On Error GoTo ErrHandler 

If Me.S_ID Is Null Then 
    trigger = 1/0 
End If 

Exit Sub 

ErrHandler: 
    MsgBox ("Key was null, fix it") 
Resume Resume_spot 

Resume_spot: 

End Sub 

我還沒有當發生錯誤,因此沒用MsgBox和缺乏Resume_spot後什麼寫什麼,我希望獲得這樣做的代碼。在我得到那麼遠之前,我想讓錯誤處理正確觸發。

+2

顯然不是答案,但不應該***後端***負責維護自己的身份列完整性?爲什麼它不是在SQL Server中定義爲「NOT NULL」? – Comintern

+1

順便說一句,如果你的'MsgBox'包含'Err.Number'或'Err.Description',它使得調試變得非常容易。 – Comintern

+1

*「(或在創建新記錄時將其保留爲空)」* - 這將**不觸發控件的「BeforeUpdate」事件。 – Andre

回答

3

其他的答案解釋的解決方案,所以我將解釋問題。在這條線「所需的對象」:你的錯誤處理程序捕獲一個運行時錯誤424

If Me.S_ID Is Null Then 

Is比較運營商需要將測試雙方評估的對象。 Null不是一個對象,因此是錯誤。您的「觸發代碼」trigger = 1/0旨在通過零錯誤引發除法,因此絕不會觸發。

這就是說,如果你需要測試一個錯誤處理程序或創建一個特定的錯誤,這是很容易只使用Err.Raise代替。

5

您需要使用IsNull

變化:

If Me.S_ID Is Null Then 

要:

If IsNull(Me.S_ID) Then 
0

1-爲什麼奇怪的建設與trigger

只是做

If IsNull(Me.S_ID) Then 
    MsgBox "Key was null, fix it" 
    Cancel = True 
End If 

2 - 對於一個簡單的檢查,這樣,你不需要任何代碼。使用表格控件Validation rule

3-這一切並不涵蓋用戶從來沒有開始進入控制任何東西的情況下。這可以在Form_BeforeUpdate()中通過在那裏設置Cancel = True來處理。

+0

,但訪問其翻轉shit和不允許你退出直到你輸入一些東西,所以如果用戶錯誤地打開了一條新記錄,我將會得到無效的數據。 – Rominus