【问题标题】:How can you check for null in a VBA DAO record set?如何检查 VBA DAO 记录集中的空值?
【发布时间】:2010-10-14 10:20:34
【问题描述】:

我在使用 DAO 记录集提取的数据库中有一个可选字段。在将其与其他字段连接之前,我需要检查该字段是否已设置。到目前为止,我已经使用Is= 尝试了以下代码sn-p(这显然是错误的语法[[Is | =]])无济于事。看来,如果我使用=,它将无法正确与Null 进行比较,如果我使用Is,则它会抱怨它没有与对象进行比较。

While Not rs.EOF
    If rs.Fields("MiddleInitial") [[Is | =]] Null Then thisMiddleInitial = "" Else thisMiddleInitial = rs.Fields("MiddleInitial")
    If prettyName(myLastName, myFirstName, myMiddleInitial) = prettyName(rs.Fields("LastName"), rs.Fields("FirstName"), thisMiddleInitial) Then
        MsgBox "Yay!"
    End If
    rs.MoveNext
Wend

如果有更简单的方法可以做到这一点,我完全愿意接受。 prettyName 将 3 个字符串作为参数,最初我只是试图直接传递 rs.Fields("MiddleName") 但它以 Null 值抛出。我宁愿做一些更直接的事情,但这是我能想到的最好的。

【问题讨论】:

    标签: ms-access null vba dao


    【解决方案1】:

    怎么样:

    IsNull(rs.Fields("MiddleInitial").Value)
    

    您还可以查看this article,它对 Access VBA 应用程序中的 Null 值以及如何处理它们进行了一些解释。

    【讨论】:

      【解决方案2】:

      对于您展示的示例,Nz 可以工作:

          thisMiddleInitial = Nz(rs!MiddleInitial,"")
      

      或者简单地将字符串与空字符串连接:

          thisMiddleInitial = rs!MiddleInitial & ""
      

      【讨论】:

        【解决方案3】:

        在我看来,Remou 已经回答了您的问题,但在我看来,您可能只是在尝试正确连接名称字段。在这种情况下,您可以在 VBA 中使用 Mid() 和 Null 传播来获得结果。

        我不使用单独的中间初始字段,所以我常用的名称连接公式是:

        Mid(("12" + LastName) & (", " + FirstName), 3)
        

        如果 LastName 为 Not Null,则开头的“12”字符串将被丢弃,如果 为 null,则将被忽略,因为 + 连接运算符传播 Null。

        将其扩展为包含中间字母应该如下所示:

        Mid(("12" + LastName) & (", " + FirstName) & (" " + MiddleInitial), 3)
        

        假设您的 UDF 没有对昵称/缩写/等进行某种复杂的清理,在我看来,这可以完全取代它。

        【讨论】:

        • 聪明的把戏,但是依赖 + 和 & 运算符之间这种相当模糊的区别是有风险的,imo。如果有人稍后返回并尝试清理代码,他们可能会决定将所有 + 替换为 &,反之亦然,以保持一致性,而没有意识到它会改变行为。
        • 我不太担心不了解 Jet SQL 连接运算符基础知识的人可能会搞砸事情。他们很容易弄乱为相同目的创建的 UDF,因为他们不了解它的工作原理。
        • 同意,了解运营商的工作方式是相当基础的东西。
        【解决方案4】:

        If rst.Fields("MiddleInitial").Value = "Null" Then

        这对我有用。我使用 MS SQL 数据库。

        【讨论】:

          【解决方案5】:

          我认为 NoMatch 选项可能适用于这种情况:

          如果 rs.NoMatch = True 那么

          【讨论】:

            【解决方案6】:

            我更喜欢使用下面的方法来解释 Null 和 Empty 字符串值。使用表单从用户那里收集值是一个很好的检查。

            If Trim(rs.Fields("MiddleInitial") & "") = "" then
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-08-30
              • 2016-07-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-14
              相关资源
              最近更新 更多