如何在MS SQL中结合WHERE条件使用SUM()函数(ASP.NET C#场景)
解决ASP.NET C#中带WHERE条件的SUM查询问题
咱们先拆解下你代码里的几个核心问题,一步步来修正:
问题1:SQL语句语法错误
你写的查询语句存在语法问题,没必要用嵌套子查询,直接在SUM(itemrate)后加WHERE条件即可,而且原语句里itemrate和后续子查询之间缺少分隔逗号,会导致数据库解析失败。
问题2:SqlDataAdapter未关联参数化SqlCommand
你创建了SqlCommand并添加了参数,但没把这个命令和SqlDataAdapter绑定,导致参数根本没传递到查询里,数据库无法识别@foodname对应的取值。
问题3:提前关闭数据库连接
在调用sda.Fill(dt)之前就关闭了连接,而Fill方法需要连接处于可用状态(即便DataAdapter支持自动管理连接,手动提前关闭也会引发异常)。
问题4:资源未安全释放
手动调用Dispose不如用using语句,它会自动释放连接、命令、适配器等资源,避免内存泄漏和资源占用问题。
修正后的完整代码
// 使用using语句自动管理各类资源,无需手动Dispose using (SqlConnection conn = new SqlConnection(DecryptString(System.Configuration.ConfigurationManager.AppSettings["cn"], EncryptionKey2))) { // 简化后的正确SQL语句,给SUM结果起别名提升可读性 string query = "SELECT SUM(itemrate) AS TotalAmount FROM darkwight_cart WHERE foodname = @foodname"; using (SqlCommand cmd = new SqlCommand(query, conn)) { // 将参数绑定到命令 cmd.Parameters.AddWithValue("@foodname", "Pizza"); using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); sda.Fill(dt); // 处理无匹配数据的情况(SUM会返回DBNull) if (dt.Rows.Count > 0 && dt.Rows[0]["TotalAmount"] != DBNull.Value) { subtotallbl.Text = dt.Rows[0]["TotalAmount"].ToString(); } else { subtotallbl.Text = "0"; // 无数据时显示0避免报错 } } } }
额外说明
- 给SUM结果起别名
TotalAmount,比用索引dt.Rows[0][0]更直观,也降低后续修改的风险。 - 增加了NULL判断:如果没有匹配
foodname='Pizza'的数据,SUM会返回DBNull,直接ToString会引发异常,提前判断能避免这类问题。
内容的提问来源于stack exchange,提问作者Ravinder Godara
相关产品推荐
相关产品推荐

