2016-09-14 56 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