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

