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

ASP.NET WebForms带条件查询时GridView无法正常获取数据问题

问题诱因
  • 逻辑错误的Session使用:代码将用户输入的cname同时作为Session的键与值存储,若当前会话未提前初始化对应键、或用户输入包含Session键非法字符,会导致Session[cname]读取结果为空,拼接后的SQL查询条件变为customer_id='',要么无匹配数据要么触发语法错误,且此处Session逻辑完全冗余无必要。
  • SQL拼接导致的语法/类型错误:直接拼接用户输入构造SQL语句,若用户输入包含单引号、特殊字符,会破坏SQL语法结构导致查询失败;如果数据库中customer_id为数值类型(int/bigint等),拼接时额外添加的单引号会触发数据库类型不匹配报错。
  • 非托管资源未释放:SqlConnection、SqlCommand、SqlDataReader均属于非托管资源,代码中未手动释放,多次请求后会出现连接池占满、资源泄漏,导致后续查询执行失败。
解决方法
  1. 移除冗余Session逻辑:此处无需用Session存储用户输入,直接读取TextBox2.Text即可,若确实需要持久化存储,使用固定键名存储,例如Session["CustomerId"] = TextBox2.Text。
  2. 改用参数化查询构造SQL语句:彻底解决SQL注入风险、语法错误、类型不匹配问题。
  3. 用using语句自动释放非托管资源,避免资源泄漏。
  4. 可新增异常捕获逻辑,便于定位具体报错原因。

修正后的代码示例:

protected void Button2_Click(object sender, EventArgs e)
{
    string customerId = TextBox2.Text.Trim();
    // 可选先校验输入是否为空
    if(string.IsNullOrEmpty(customerId))
    {
        // 此处可添加输入为空的提示逻辑
        return;
    }
    // 使用using自动释放连接资源
    using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["mycon"].ToString()))
    {
        string sql = "SELECT * FROM customer_reservations WHERE customer_id = @CustomerId ORDER BY reservation_time";
        using(SqlCommand cmd = new SqlCommand(sql, con))
        {
            // 添加参数,自动匹配数据库类型,如果customer_id为数值类型可先做类型转换:Convert.ToInt32(customerId)
            cmd.Parameters.AddWithValue("@CustomerId", customerId);
            con.Open();
            using(SqlDataReader reader = cmd.ExecuteReader())
            {
                GridView1.DataSource = reader;
                GridView1.DataBind();
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者000mzmx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:08