也说ExecuteScalar和ExecuteNonQuery

来源:互联网 发布:淘宝店铺模板图片 编辑:程序博客网 时间:2024/05/16 00:24



判断数据的存在性的时候
由于写sql的并不是非常规范,有时候用ExecuteScalar去执行查询的sql

select  column1,column2 …… from Table where ……    有时候用select count(*) from table

后来发现因为程序出了点问题,才发现这里面的一些细节,又发现人家有这样的写法


Object obj=cmd.ExecuteScalar()if(Object.Equals(obj,null))||Object.Equals(DBNull.Value,obj)){return null;}else{return obj;}



就专门来研究研究这个ExecuteScalar返回值的问题,

ExecuteScalar就是返回第一行第一列,当你执行的sql为

select COUNT(*) from dbo.Table where Column='aaaa' 
的时候,他返回第一行第一列,这样的话,存在的话就是一个大于零 的树,不存在的话就是0,返回的obj肯定不为空,要想判断是否有统计数据的话,只能把这个obj转化为整数再判断其是否大于零,这里不需要判断obj是否为空,可以直接对其转化为整数,因为即使没有返回值,这个obj也为0(主要是我发现公司有人写代码就先判断是否为null,再转化为整数,假如你sql是统计信息的话,也就是select count 的话,返回的obj一定存在)

另外就是让当sql为

select  column1,column2 ……from Table where ……
的时候,去执行ExecuteScalar,这时依然返回的是第一行第一列,假如根据查询条件差选到数据存在,那么此时的返回值是什么情况呢?还要根据这个字段在数据库中是否存在来判断,假如在数据库中不为空那个这个obj就非空,也即if (obj == null)不成立,如果数据库中这个字段为空,在数据库中是null,
if (obj == null)依然不成立,但是if (obj == DBNull.Value)是成立的,但是书上为什么在
ExecuteScalar的返回值中加上(红字体部分)

if(Object.Equals(obj,null))||Object.Equals(DBNull.Value,obj)),

就不大理解了,你不能限制ExecuteScalar一定执行select count()的sql啊?
或许我去执行

select column1,column2 from Table where column3=‘*’

根据返回值情况去判断一个数据是否存在呢?(当然这样不大规范,一定要改正)


顺便记录一下,在数据库中把一个字段更新为'',也即

update Table set column1='' where column3='aaa'

那么查询这个字段的sql也即select column1 from table where column3=‘aaa’去执行ExecuteScalar,
if (obj == null)和if (obj == DBNull.Value)均不成立,说明数据库中‘’也是存在的



其实动手试试,结果就一目了然了


PS:最近很忙,累的头晕!!!


再PS:csdn博客编辑功能真是蛋疼



原创粉丝点击