ExecuteScalar,如果没得到数据,值是DBNull.Value,而不是null

本文详细解析了SQL ExecuteScalar()方法的使用规则及常见错误案例,包括如何正确判断返回值是DBNull.Value还是null,以及如何在不同情况下正确处理返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ExecuteScalar()方法如果没得到数据,值是 DBNull.Value ,而不是null如果table表中的anull值,则应该用DBNull.Value来判断:string sql = "select a from table where id=1";object o = Dbl.CreateCommand().CreateSqlScalar(sql);
//正确
if (o == DBNull.Value)
 {
        toSign(uid);
        return "1";
 }//错误: 因为永远不会执行该句if(o==null){... ... }//返回的各种值:

select 1 这样返回的object是 1
    select null 这样返回的是DBNull.Value
    selectisnull(null,1) 返回的是 1
    select top 0id from table1 这样返回的值是null
    selectisnull(id,0) from table1 where 1=0 返回的值是null

    这里ExecuteScalar的规则就是,返回第一列,第一行的数据。假如第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。假如有第一行,但是第一列为空,那么返回的是DBNull 。假如一行都没有,那么ExecuteScalar就返回null

   规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull和null的情况混淆,例如:

    stringusername=cmd.ExecuteScalar().ToString();

   除非您认为cmd执行后,肯定至少有一行数据,否则这里就会出错。

    又或 selectid from usertable where username=@name这样的sql语句,假如很难找到记录,那么ExecuteScalar则会返回null,所以千万不要

    intuserid=Convert.ToInt32(cmd.ExecuteScalar());

    或您会这样写SQL 语句:select isnull(id,0) from usertable where username=@name

    但是 intuserid=Convert.ToInt32(cmd.ExecuteScalar());依然会出错,因为上面的语句不成立时,仍然是不返回任何行。

   对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,假如为null,则代表该参数没有指定,或是代表DEFAULT。假如为DBNull.Value,则代表SQL中的NULL

   所以,假如您要调用存储过程,里面有参数 @val nvarchar(20)="AABB" ,
   那么cmd.Parameters["@val"].Value=null 代表使用这个默认的 "AABB"
   而cmd.Parameters["@val"].Value=DBNull.Value 代表使用NULL来传给 @val


   您能够用Convert.IsDBNull来判断一个值是否DBNull。注意Convert.IsDBNull(null)是false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值