空值的判断

假定某个表的金额列,由单价、数量、折扣三列计算得出,此外年、月两列,由日期列计算得出。
根据我们之前的经验,可以将该表的DataColChanged事件设置为:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
   
Case "数量","单价","折扣"
        dr(
"金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
   
Case "日期"
        dr(
"年") = dr("日期").Year
        dr(
"月") = dr("日期").Month
End
Select

上面的代码看上去很完美,金额、年、月三列都能自动计算得出,可真的没问题吗?
我们来测试一下,你先在某行输入日期,年、月两列的值确是自动计算得出了,可是如果你删除日期列的内容,按道理年、月列的内容应该为空。
但事实上,年、月都会等于1, 原因何在呢?
这是因为在日期列为空的时候,通过行返回的日期值并不是空值,而是等于: #01/01/0001#
同样如果没有输入数量和单价,金额也不会为空,而是等于0,因为数值列为空的时候,其返回的值也不是空值,而是0。

所以为了“完美”,我们将DataColChanged事件代码改为:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
    Case "数量","单价","折扣"
       
If dr.IsNull("数量") OrElse dr.IsNull("单价") Then
'如果数量或单价为空
            dr("金额") = Nothing
        Else

   
        dr("金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
        End If
    Case "日期"
   
    If dr.IsNull("日期") Then
'如果日期列为空
            dr("年") = Nothing
            dr("月") = Nothing
        Else

            dr("年") = dr("日期").Year
            dr("月") = dr("日期").Month
        End If
End
Select

这样输入日期,年、月列的值能自动计算得出,删除日期,年、月列也会自动被清空。

需要注意空值的判断方法,例如有人写出了类似下面这样的代码:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
    Case "数量","单价","折扣"
       
If dr("数量") Is Nothing OrElse dr("单价") Is Nothing Then
            dr(
"金额") = Nothing
        Else

            dr(
"金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
        End
If
    Case
"日期"
       
If dr("日期") Is Nothing Then
            dr(
"年") = Nothing
            dr(
"月") = Nothing
        Else

            dr(
"年") = dr("日期").Year
            dr(
"月") = dr("日期").Month
        End
If
End
Select

然后很疑惑,为什么上述代码没有正确判断空值?例如在没有输入日期的时候,年、月两列并不为空,而是等于1。
这是因为 dr("列名") Is Nothing 是不能用来判断某列是否为空的,道理前面已经讲了,对于数值列,如果值为空,dr("列名")返回的是0,如果是日期列,则返回#01/01/0001#,显然这都不是空值,所以我们只能用IsNull方法判断某列是否为空。
实际上任何类型的列,包括字符型列,都不能用dr("列名") Is Nothing来判断是否是空值,因为对于字符列,如果值为空,dr("列名")返回的是空字符"",而不是空值Nothing

总之,判断某列是否为空,不管列类型是什么,最好使用IsNull方法,这是最可靠的方式。


本页地址:http://www.foxtable.com/webhelp/topics/1470.htm