关于ExecuteScalar您可能会疏忽的地方
时间:2011-05-12 来源:FrogTan
大家都很熟悉SqlCommand的ExecuteScalar方法:
object obj = command.ExecuteScalar();
该方法会返回一个标量值。很多时候,我们需要对obj进行是否为空的验证。这时候问题就来了,到底是该
if( obj != null )
还是
if( obj != DBNull.Value)?
首先我们来看看ExecuteScalar的使用场景
- 配合T-Sql的聚合函数使用,如Count
- 当返回某一行特定列时也可以使用
总之就是当查询结果只是一个标量值的时候就可以使用。
接下来我们假定有这样一张数据表(Student):
ID | PK |
Name | NOT NULL |
Age | NULL |
再假设该表有如下数据:
ID | Name | Age |
1 | Tom | NULL |
2 | Mike | NULL |
如果我们要取得所有Student中Age最大值,可以如下
SELECT MAX(Age) FROM dbo.Student WITH(NOLOCK)
在.NET 这一层我们就可以使用ExecuteScalar来取得值了。我们知道T-Sql的结果是NULL,但在.NET这边呢?我们一跟踪就会发现是DBNull.
因此我们可以就此下结论了么?不能。
紧接着再来看种情形。要求我们获取ID=3的学生的姓名
SELECT TOP 1 Name FROM dbo.Student WITH(NOLOCK)
WHERE ID = 3
很显然,该语句的结果是一个空的结果集。
这时候再去跟踪你就会发现返回值为null.
因此对于很多经常只简单判断!=null 或者!= DNNull.Value的童鞋要注意了,说不定什么时候代码就出问题了。
再简单总结下:当sql语句返回NULL时,.NET这一端的返回值为DBNull.Value
当sql语句这一端为空结果集时,.NET这一端为null.
希望对各位能有帮助。