购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱14
糟糕透顶
——使用null对数据库的空值进行比较时的陷阱

1.陷阱产生的场景

在C#语言中,null关键字是表示不引用任何对象的文字值。在应用程序开发中,null是引用类型变量的默认值,常用来进行引用是否为空的判断。但在对数据库中的数据进行是否为空的判断时,可能使用null关键字并不适合,比如本实例用null判断用户信息表中的密码字段值是否为空。

例4.14 使用null对数据库的空值进行比较时的陷阱(光盘位置:光盘\MR\Instance\ 4\14\MisapplyNull),该实例的详细说明如下。

本实例实现获取用户信息表中的密码为空的用户数量,为了使演示的效果更加明显,首先列出用户信息表中的记录信息情况,如图4.26所示。

图4.26 数据记录窗口

从图4.26中可以看到,存在两条密码为空的用户记录。实现统计用户信息表中的密码为空的用户数量的主要代码如下:

上面的代码使用null关键字判断当前记录的密码是否为空,若为空,则计数器intNum的值自增1,本实例运行结果如图4.27所示。

从图4.26中看到有两条密码为空的用户记录,但本实例运行结果却显示“密码为空的操作员不存在”。

2.陷阱的分析

从运行结果初步判断,reader["UserPass"]对象的值不为null,所以才造成计数器没有发生自增。接下来添加对reader["UserPass"]对象的快速监视,如图4.28所示。

图4.27 运行结果

图4.28 快速监视

从图4.28中可以看到,reader["UserPass"]对象的值确实为空,但其所在的if语句的判定条件却为false,这说明reader["UserPass"]对象的空值不等于null。那么总结这个空值的特点就是,它与null的相等比较为false,但它确实为空,为此我们应该想到C#中的DBNull类型。通过进一步研究得知,ADO.NET对象从数据库中读取空值时,空值会被实例化,即数据库中的null被转换为DBNull的实例。

3.陷阱的解决方法

解决办法就是应用DBNull来判断数据对象的值是否为空,本实例提出以下两种解决方法。

❏ 通过DBNull.Value来判断是否为空值,修改代码如下:

❏ 使用Convert类的IsDBNull方法判断数据对象是否为DBNull,修改代码如下: pXr6rjwS0HSNsbYBEX2Nw0xmeGy3ICkHnIibT2BB8l5xuqt/xfL2YC5f5n1qq0NO

点击中间区域
呼出菜单
上一章
目录
下一章
×