Vba 为什么是';关于错误';总是像密钥为空一样触发?
我正在尝试在连接到SQL Server后端的Access应用程序中设置错误处理,以防止Access向服务器传递空主键 我使用的是BeforeUpdate和基于 如果用户将S_ID设置为null(或在创建新记录时将其保留为null),则我的代码应该运行ErrHandler代码。但是它总是运行ErrHandler代码Vba 为什么是';关于错误';总是像密钥为空一样触发?,vba,ms-access,Vba,Ms Access,我正在尝试在连接到SQL Server后端的Access应用程序中设置错误处理,以防止Access向服务器传递空主键 我使用的是BeforeUpdate和基于 如果用户将S_ID设置为null(或在创建新记录时将其保留为null),则我的代码应该运行ErrHandler代码。但是它总是运行ErrHandler代码 Private Sub S_ID_BeforeUpdate(Cancel As Integer) Dim trigger As Integer On Error GoTo ErrH
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
我还没有为错误发生时希望Access执行的操作编写代码,因此
MsgBox
没有用处,在Resume\u spot
之后也没有任何内容。在此之前,我希望正确触发错误处理。您需要使用IsNull
更改:
If Me.S_ID Is Null Then
致:
1-为什么使用
触发器的奇怪构造
照办
If IsNull(Me.S_ID) Then
MsgBox "Key was null, fix it"
Cancel = True
End If
2-对于这样一个简单的检查,您不需要任何代码。对表单控件使用
3-所有这些都不包括用户从未开始在控件中输入任何内容的情况。这可以在表单\u BeforeUpdate()
中通过在此处设置Cancel=True
来处理。其他答案解释了解决方案,因此我将解释问题。您的错误处理程序在此行捕获运行时错误424:“需要对象”:
If Me.S_ID Is Null Then
Is
比较运算符要求测试的两侧对对象求值Null
不是一个对象,因此错误。您的trigger=1/0
的“trigger code”(触发器代码)旨在引发零除错误,但从未触发
这就是说,如果您需要测试错误处理程序或创建特定的错误,只需使用Err.Raise
就可以轻松得多。显然不是答案,但后端不应该负责维护自己的标识列完整性吗?为什么不在SQL Server中将其定义为NOT NULL
?顺便说一句,如果您的MsgBox
包含Err.Number
或Err.Description
,这使得调试非常容易。”(或者在创建新记录时将其保留为NULL)-这不会触发控件的BeforeUpdate
事件。@Comintern它被定义为not NULL
,但我不希望用户必须解析SQL server ODBC失败消息。我使用的是验证规则,但Access会自动跳转,在输入内容之前不允许您退出该字段,因此,如果用户错误地打开了一条新记录,我将获得无效数据。
If Me.S_ID Is Null Then