access空值Null的常见错误

2019-09-30 16:29:00
tmtony8
原创
475

在access中,遇到Null时的常见问题:

1:条件为空

如果在查询的字段下输入条件,则它返回匹配的记录。如果记录中有Null值记录呢?

如在个人信息查询中, 输入“张三”可以筛选他的记录。

 “张三”

输入Not "张三",可以筛选出不是“张三”的非空记录

 NOT “张三”

显然这结果是这两个查询都不包含姓名为Null的记录


解决办法:

指定Null对于上面的第二个查询,要满足不是“张三”的所有记录,条件必须是:

Is Null Or Not "张三"



2:表达式中有Null

涉及Null的计算通常会导致空值。

如在文本框的ControlSource属性中输入如下表达式,显示支付的金额:

 = [单价]*[数量]

如果数量为NUll,因此文本框什么也不显示。


解决办法

使用Nz()函数为Null指定一个值:

 = Nz([单价],0)-Nz([数量],0)


3:外键为空

Access中主键是不能有空值的,但是却允许外键出现空值。在大多数情况下,我们应该阻止这种可能使记录孤立的情况出现。

如在商品订购中,在订单表中有订单编号,在订单明细中,订单编号是外键,access是允许外键为空的。

由于订单明细中的这些记录与主表中的任何记录都不匹配,因此这些孤立的记录将不再显示。


解决办法

在表设计视图中,将外键字段的必需属性设置为Yes,除非明确希望在外键中使用Null。



4:空值和非变量

在VBA中,唯一可以包含Null的数据类型是Variant。当字段的值分配给非变量时,都必须考虑该字段可能为空的可能性。

如下面的代码:

Dim strName as String
Dim lngID As Long
strName = Me.MiddleName
lngID = Me.ClientID

当MiddleName字段包含Null时,会将Null分配给字符串,此时会产生error

同样,将ClientID值分配给数字变量可能会导致错误。


解决办法

(a)如果需要使用空值,请使用Variant数据类型。

(b)使用Nz()函数指定要用于Null的值。例如:

 strName = Nz(Me.MiddleName,“”) lngID = Nz(Me.ClientID,0)


5:比较为空

如表达式:

If [fname] = Null Then
这又是Null的一个错误:结果既不是True也不是False,而是Null。


解决办法

使用IsNull()函数:

If IsNull([fname]) Then


6:忘记Null既不是True也不是False。

这两个结构是否做同样的工作?

(a)	If [fname] = "王" Then
	    MsgBox "It's a 王"
	Else
	    MsgBox "It's not a Smith"
	End If

(b)	If [fname] <> "王" Then
	    MsgBox "It's not a 王"
	Else
	    MsgBox "It's a 王"
	End If

当“姓名”为Null时,这两个代码相互矛盾在这两种情况下,If失败,因此执行Else,从而导致出现矛盾的消息。


解决办法

(a)处理比较的所有三个结果- 正确,错误和无效

If [fname] = "王" Then
	    MsgBox "It's a 王"
	ElseIf [fname] <> "王" Then
	    MsgBox "It's not a 王"
	Else
	    MsgBox "We don't know if it's a 王"
	End If


(b)在某些情况下,Nz()函数可让您一起处理两种情况。例如,以相同的方式处理Null和零长度的字符串:

If Len(Nz([fname],"")) = 0 Then

分享