Ms access 如何检查VBA DAO记录集中的null?
我在数据库中有一个可选字段,我正在使用DAO记录集提取该字段。我需要先检查该字段是否已设置,然后再将其与其他字段连接起来。到目前为止,我已经用Ms access 如何检查VBA DAO记录集中的null?,ms-access,null,vba,dao,Ms Access,Null,Vba,Dao,我在数据库中有一个可选字段,我正在使用DAO记录集提取该字段。我需要先检查该字段是否已设置,然后再将其与其他字段连接起来。到目前为止,我已经用Is和=尝试了以下代码片段(这显然是错误的语法[[Is |=]]),但没有用。如果我使用=它将无法正确地与Null进行比较,如果我使用Is它会抱怨它没有与对象进行比较 While Not rs.EOF If rs.Fields("MiddleInitial") [[Is | =]] Null Then thisMiddleInitial = ""
Is
和=
尝试了以下代码片段(这显然是错误的语法[[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”),但它抛出了一个空值。我想做一些更直接的事情,但这是我能想到的最好的办法。怎么样:
IsNull(rs.Fields("MiddleInitial").Value)
您还可以查看其中关于Access VBA应用程序中的空值的一些解释以及如何处理这些值。对于您展示的示例,Nz将起到以下作用:
thisMiddleInitial = Nz(rs!MiddleInitial,"")
或者简单地将字符串与空字符串连接:
thisMiddleInitial = rs!MiddleInitial & ""
在我看来,Remou已经回答了您的问题,但我突然想到,您可能只是试图获得名称字段的正确连接。在这种情况下,可以在VBA中使用Mid()和Null传播来获得结果 我不使用单独的中间初始字段,因此我通常的名称串联公式是:
Mid(("12" + LastName) & (", " + FirstName), 3)
如果LastName不为Null,则开始处的“12”字符串将被丢弃,如果为Null则被忽略,因为+串联运算符传播Null
要将其扩展到包括中间初始值,请如下所示:
Mid(("12" + LastName) & (", " + FirstName) & (" " + MiddleInitial), 3)
假设您的UDF没有对昵称/缩写等进行某种复杂的清理,在我看来,这可能会完全取代它。如果rst.Fields(“MiddleInitial”).Value=“Null”那么
这对我有用。我使用MS SQL数据库 我认为NoMatch选项可能适用于这种情况:
如果rs.NoMatch=True,则我更喜欢使用下面的公式来解释空字符串值和空字符串值。使用表单收集用户的值是一个很好的检查
If Trim(rs.Fields("MiddleInitial") & "") = "" then
聪明的把戏,但依我看,依赖+和&运算符之间这一相当模糊的差异是有风险的。如果有人稍后返回并试图清理代码,为了一致性,他们可能会决定将所有+替换为&,反之亦然,在没有意识到它会改变行为的情况下,我并不太担心有人不了解Jet SQL的连接运算符的基础知识会把事情搞砸。因为他们不了解UDF是如何工作的,所以他们很容易搞乱为相同目的创建的UDF。