首页 新闻 会员 周边

用ExecuteScalar执行Select count(*)的奇怪现象。

0
悬赏园豆:100 [已关闭问题] 关闭于 2009-12-29 10:35

用.net 2.0(sp1)访问SqlServer 2005(打过累计补丁包),对一个表进行Select count(*)查询。

用SqlCommand的ExecuteScalar()方法返回结果。可是会偶然性间歇性的出现查询不出结果。

command.ExecuteScalar()后得到的结果为DBNull.Value,有朋友遇到过这个问题吗?困扰我很久了。

之前用Nhibernate实现,发现间歇性hql query出错,改成强类型DataSet,Fill的时候间歇性出错。改成SqlConnection+SqlCommand查询select *和Select count(*)都会出现本来有数据结果返回DBNull.Value,归根结底都是不能重现的,并发量高时候出现.net sql client访问数据库的错误。这是微软的bug吗?希望有人帮我解决,谢谢大家。

附表的DDL:

CREATE TABLE [dbo].[Table](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FKCode] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [GUID] [varchar](256) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_CHANNELUNIQUERESID] PRIMARY KEY CLUSTERED
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

CREATE  UNIQUE  INDEX [AK] ON [dbo].[Table]([FKCode], [GUID]) ON [PRIMARY]

悠然轻松的主页 悠然轻松 | 初学一级 | 园豆:112
提问于:2009-12-17 11:26
< >
分享
所有回答(2)
0

select时候尽量带着nolock

有可能是查询超时了

 

这个是很正常的

ExecuteScalar :返回第一列,第一行的数据。

第一列第一行不为空,那么ExecuteScalar就直接对应的值。

有第一行,但是第一列为空,那么返回的是 DBNull 。

一行都没有,那么ExecuteScalar就返回null

所以建议你加一个判断

if (obj == null && obj == DBNull.Value) { isHave = false; }

persialee | 园豆:3217 (老鸟四级) | 2009-12-17 11:41
查询超时肯定会截获到SqlException的。目前ExecuteScalar是没有任何异常的。只是没有我期望的正确的值。只有生产系统偶尔出现,开发调试无法重现。
支持(0) 反对(0) 悠然轻松 | 园豆:112 (初学一级) | 2009-12-17 13:27
@无类唯南: 这个是很正常的 ExecuteScalar :返回第一列,第一行的数据。 第一列第一行不为空,那么ExecuteScalar就直接对应的值。 有第一行,但是第一列为空,那么返回的是 DBNull 。 一行都没有,那么ExecuteScalar就返回null 所以建议你加一个判断 if (obj == null && obj == DBNull.Value) { isHave = false; }
支持(0) 反对(0) persialee | 园豆:3217 (老鸟四级) | 2009-12-17 13:48
@persialee:SELECT COUNT(*)会返回几行几列?一定是一个单值,不是0就是大于0.怎么会有第一行第一列为空哦。
支持(0) 反对(0) 悠然轻松 | 园豆:112 (初学一级) | 2009-12-18 09:25
@无类唯南: select null 这样返回的是DBNull.Value select top 0 id from table1 这样返回的值是null select isnull(id,0) from table1 where 1=0 返回的值是null
支持(0) 反对(0) persialee | 园豆:3217 (老鸟四级) | 2009-12-19 00:44
0

换成Select count(1)或Select count (主键)试试

邀月 | 园豆:25475 (高人七级) | 2009-12-17 11:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册