数据库无记录时返回0的实现及SqlNullValueException报错解决
问题解决:处理Sum查询返回Null引发的SqlNullValueException
问题详情
运行项目时反复出现以下错误:
System.Data.SqlTypes.SqlNullValueException: 'Data is Null. This method or property cannot be called on Null values.'
需求明确:即使数据库表无数据行,查询结果也需返回0。
现有代码:
public int Plantcount() { var query = "SELECT Sum(Amount ) as Total FROM Carttable"; string sqlDataSource = _configuration.GetConnectionString("DefaultConnection"); int totalAmount = 0; using (SqlConnection con = new SqlConnection(sqlDataSource)) { con.Open(); using (SqlCommand cmd = new SqlCommand(query, con)) { using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.Read()) { totalAmount = dr.GetInt32(0); } } } con.Close(); } return totalAmount; }
当前数据库表状态:
| Id | Item | Total |
|---|---|---|
| - | - | - |
期望输出:
| Total |
|---|
| 0 |
解决方案
两种可行方案,任选其一即可:
方案1:修改SQL语句,强制返回0
当表无数据时,SUM(Amount)会返回Null,用ISNULL或COALESCE函数将Null替换为0:
SELECT ISNULL(Sum(Amount), 0) as Total FROM Carttable
或:
SELECT COALESCE(Sum(Amount), 0) as Total FROM Carttable
此方式下SQL直接返回0,C#代码无需额外处理。
方案2:在C#代码中判断Null值
若不想修改SQL,可在读取数据时先检查字段是否为Null:
public int Plantcount() { var query = "SELECT Sum(Amount ) as Total FROM Carttable"; string sqlDataSource = _configuration.GetConnectionString("DefaultConnection"); int totalAmount = 0; using (SqlConnection con = new SqlConnection(sqlDataSource)) { con.Open(); using (SqlCommand cmd = new SqlCommand(query, con)) { using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.Read()) { totalAmount = dr.IsDBNull(0) ? 0 : dr.GetInt32(0); } } } // using块会自动关闭连接,无需手动调用con.Close() } return totalAmount; }
注:SqlConnection在using块结束后会自动释放并关闭连接,可删除多余的con.Close()调用。
内容的提问来源于stack exchange,提问作者Ken John
相关产品推荐
相关产品推荐

