【问题标题】:IsNull always returns falseIsNull 总是返回 false
【发布时间】:2017-07-29 17:35:22
【问题描述】:

我使用 MS Access 作为 SQL Server 2012 的前端,在将更新传递给服务器之前测试字段中的空值,并向用户显示有用的消息。

BeforeUpdate 事件中使用If IsNull 以及一些花哨的重复检查,我让它在一个字段中运行良好。但是,当为另一个变量实现相同的代码时,IsNull 的计算结果始终为 false。

我尝试删除所有有用的代码,只使用带有消息框的IsNull

If IsNull(Me.M_RN) Then
    MsgBox "null!"
Else
    MsgBox "Not null!"
End If

此代码始终返回“Not null!”。如果我反转它并使用:

If not IsNull(Me.M_RN) Then
    MsgBox "Not null!"
Else
    MsgBox "null!"
End If

它仍然返回“Not null!”每次。我还尝试了其他事件状态,例如ChangeKeyUpDirty。无论事件如何,IsNull 都会返回 false。

这些字段的表单对象具有相同的属性。我能看到的唯一区别是工作变量采用numeric(18,0) 格式且未编入索引,而非工作变量采用int 格式并具有唯一索引。

如果我删除所有代码,我会在更新时收到 You tried to assign the Null value to a variable that is not a Variant data type 错误。

【问题讨论】:

  • 错误出现在哪一行?
  • @Nick.McDermaid 我不确定你的意思;这不是编译错误,所以它没有显示它搞砸了哪一行。
  • @McNets 这不是有效的 vba,不会做任何事情
  • 是的,对不起,我看错了。
  • 你试过 IsEmpty() 吗?

标签: sql-server vba ms-access sql-server-2012 ms-access-2010


【解决方案1】:

我认为您的这部分信息很关键;

非工作变量为 int 格式并具有唯一索引。

如果它具有唯一索引,那么我很确定您无论如何都无法分配空值。您是否在表中设置了默认值?

【讨论】:

  • 是的,服务器会在 null 时返回一个错误,但如果非技术用户不知道如何正确处理它,它可能会冻结 Access。因此,首先防止 null 进入服务器。
【解决方案2】:

问题是基于 SQL 后端表上的 not null 设置。 Access 在BeforeUpdate 事件之前检查它从该限制派生的验证规则。

然后弹出You tried to assign the Null value to a variable that is not a Variant data type 错误,这显然阻止了BeforeUpdate 事件的触发。

删除not null 限制允许代码运行,同时保留唯一索引。

使用Form_Error 无法解决此问题,即使将Response 设置为acDataErrContinue。在这种情况下,它会弹出一个关于验证规则的实际运行时错误,阻止更改尝试将字段设置回.OldValue 的行上的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    • 2018-11-05
    • 2019-05-06
    • 2017-04-29
    • 2013-04-30
    • 2015-01-20
    相关资源
    最近更新 更多