DataSet无匹配数据时else分支不生效的技术求助
问题原因及解决办法
核心原因
你使用了AVG聚合函数,这类函数的特性是:即使没有符合WHERE条件的行,数据库也会返回一行结果,其中AVG的计算值为NULL。你提到首列值不为空、0或空格,大概率是你的readAvgReview方法在读取数据时,把数据库返回的NULL转换成了对应数据类型的特殊默认值,导致你常规的行数、非空判断都失效。
解决办法
方案1:修改SQL查询,让无数据时返回空结果集
在SQL里加上HAVING COUNT(*) > 0,这样只有当存在符合条件的行时才返回平均值,无数据时直接返回空结果集:
SELECT AVG(你的评分字段) AS avg_rating FROM 你的表名 WHERE [你的过滤条件] HAVING COUNT(*) > 0
之后你就可以通过判断DataSet.Tables[0].Rows.Count == 0来触发NoGrades标签的显示逻辑。
方案2:在代码里判断聚合结果是否为无效值
如果不想修改SQL,就直接判断返回的平均值是否为数据库空值(比如.NET里的DBNull.Value),或者是否超出1-10的范围:
DataTable dt = dataSet.Tables[0]; object avgObj = dt.Rows[0][0]; // 先判断是否为数据库空值,再判断是否在1-10范围内 if (avgObj != DBNull.Value) { decimal avgRating = Convert.ToDecimal(avgObj); if (avgRating >= 1 && avgRating <= 10) { // 展示平均值到页面 } else { // 显示NoGrades标签 } } else { // 显示NoGrades标签 }
如果你的readAvgReview方法已经把DBNull.Value转成了特定标记值(比如-1),直接判断该标记值即可。
方案3:用SQL标记空结果
在SQL里用COALESCE(通用数据库支持)或者ISNULL(SQL Server专属)把空结果转成一个不在1-10范围内的标记值,方便代码判断:
SELECT COALESCE(AVG(你的评分字段), -1) AS avg_rating FROM 你的表名 WHERE [你的过滤条件]
之后代码里只要判断返回值是-1,就显示NoGrades标签。
内容的提问来源于stack exchange,提问作者Lnyka
相关产品推荐
相关产品推荐

