You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:32:43