Vba 为什么是';关于错误';总是像密钥为空一样触发?

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

我正在尝试在连接到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 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