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

ASP.NET中da.Fill(ds)报‘error near '='’错误求助

解决SQL语句'error near '=''错误及购物车添加逻辑优化

先给你说清楚问题出在哪:你遇到的da.Fill(ds)时的error near '='错误,本质是SQL查询里的字符串参数没加单引号。比如当item_name是"香辣鸡腿堡"这种字符串时,你直接拼接出来的SQL是:

select * from food_items where item_name=香辣鸡腿堡

数据库会把香辣鸡腿堡当成字段名,根本找不到这个字段,自然在等号位置报错。而且这种直接拼接用户输入的写法还有致命的SQL注入漏洞,恶意用户能通过构造特殊的QueryString篡改你的SQL,风险极高!

下面是修正后的代码,我同时修复了几个隐藏的小问题:

  1. 改用参数化查询,彻底解决语法错误和SQL注入
  2. 统一Session键的大小写(你原来写了Session["Buyitems"]和Session["buyitems"],大小写不一致会导致后续读取Session失败)
  3. 修正DataTable列名和赋值的不匹配(你定义的是image列,但赋值用了productimage,会报错)
  4. 添加using语句自动释放数据库连接,避免连接泄漏
  5. 增加查询结果的判断,防止没有查到商品时访问Rows[0]报错
if (!IsPostBack)
{
    DataTable dt = new DataTable();
    DataRow dr;
    // 定义DataTable列
    dt.Columns.Add("sno");
    dt.Columns.Add("itemname");
    dt.Columns.Add("price");
    dt.Columns.Add("image");
    dt.Columns.Add("cost");
    dt.Columns.Add("totalcost");

    string itemName = Request.QueryString["item_name"];
    if (!string.IsNullOrEmpty(itemName))
    {
        if (Session["BuyItems"] == null)
        {
            dr = dt.NewRow();
            // 使用using自动释放连接
            using (SqlConnection scon = new SqlConnection(ConfigurationManager.ConnectionStrings["online food orderingConnectionString"].ConnectionString))
            {
                scon.Open();
                // 参数化SQL,避免语法错误和SQL注入
                string myquery = "select * from food_items where item_name = @ItemName";
                SqlCommand cmd = new SqlCommand(myquery, scon);
                // 添加参数,指定类型和值
                cmd.Parameters.AddWithValue("@ItemName", itemName);
                
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);

                // 检查是否查询到数据
                if (ds.Tables[0].Rows.Count > 0)
                {
                    dr["sno"] = 1;
                    dr["itemname"] = ds.Tables[0].Rows[0]["item_name"].ToString();
                    dr["image"] = ds.Tables[0].Rows[0]["image"].ToString(); // 修正列名匹配问题
                    dr["price"] = ds.Tables[0].Rows[0]["price"].ToString();
                    dt.Rows.Add(dr);

                    GridView1.DataSource = dt;
                    GridView1.DataBind();
                    // 统一Session键的大小写
                    Session["BuyItems"] = dt;
                }
                else
                {
                    // 可以在这里处理商品不存在的情况,比如提示用户
                    GridView1.DataSource = null;
                    GridView1.DataBind();
                }
            }
        }
    }
}

最后再提醒几句:

  • 永远不要直接拼接用户输入到SQL语句里,参数化查询是标准做法
  • 数据库连接、命令这类资源一定要用using包裹,确保自动释放
  • 处理Session时要注意键的大小写,C#里Session的键是区分大小写的

内容的提问来源于stack exchange,提问作者ghanshyam Sehgal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:01:59