设为首页 加入收藏

TOP

DbCommand.ExecuteScalar方法(二)
2015-11-21 01:52:54 来源: 作者: 【 】 浏览:1
Tags:DbCommand.ExecuteScalar 方法
ipatterns> 从上述运行结果中,我们可以看出:
对于第二个 select 语句,DbCommand.ExecuteScalar 方法的返回值是 null,调用者需要使用 result == null 来判断。
对于第三个 select 语句,DbCommand.ExceuteScalar 方法的返回值是 DBNull.Value,调用者需要用 result is DBNull 或者 result == DBNull.Value 来判断。

对 ADO.NET 的 DbCommand.ExecuteScalar 方法的调用者来说,select keyword_id 和 select MAX(keyword_id) 都是一样方便的,只不过要注意根据所使用的 SQL 语句来选择使用 result == null 还是使用 result is DBNull 来判断查询结果是否为空。所以我建议使用 select keyword_id 这种 SQL 语句,以减少一个 SQL MAX() 调用,提高运行效率。

当然,如果使用 result == null || result is DBNull 来判断查询结果是否为空就更保险了,能够适应这两种 SQL 语句的写法,但是运行效率就稍微低了一点。

如果是使用 DbCommand.ExcuteReader 方法来获得查询结果:

对于第二个 select 语句,需要判断 DbDataReader.Read 方法的返回值来决定查询结果是否为空。
对于第三个 select 语句,DbDataReader.Read 方法的返回值总是 true,而是通过 DbDataReader.IsDBNull 方法来判断查询结果是否为空。

当然,对于查询结果最多只有一行一列的情况是不推荐使用 DbCommand.ExcuteReader 方法的。只有查询结果有可能有多行,或者查询结果有多列的情况下,才需要使用 DbCommand.ExcuteReader 方法。

《SQL反模式》中的用法

在《SQL反模式》一书第159页是在以下存储过程中使用 MAX() 函数的:

复制代码
 1 CREATE PROCEDURE BugsSearch(keyword VARCHAR(40))
 2 BEGIN
 3   SET @keyword = keyword;
 4   PREPARE s1 FROM 'SELECT MAX(keyword_id) INTO @k FROM Keywords WHERE keyword = ?';
 5   EXECUTE s1 USING @keyword;
 6   DEALLOCATE PREPARE S1;
 7   IF (@k IS NULL) THEN
 8     -- (这里省略若干语句)
 9   END IF;
10   -- (这里再次省略若干语句)
11 END
复制代码

看来这里的 MAX() 函数是不能省略的,虽然 Keyswords 表的 keyword 列上有 unique 索引,查询结果中不可能有多行,但是查询结果可能为空集,所以需要使用 MAX() 函数将空的查询结果转换为值为 NULL 的有一行的查询结果。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Birt中实现字段拆分为表的另一种.. 下一篇Redis中的键值对设计

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: