如何在ASP.NET中通过SQL查询验证产品信息并返回对应提示
代码问题修正方案
原代码核心错误
- 未做查询结果判断:执行
SqlDataReader dr = cmd.ExecuteReader()后没有检查是否返回了匹配的产品数据,无论是否查询到结果都会直接输出成功提示 - 异常逻辑使用错误:未查询到匹配数据属于业务正常分支,不会抛出系统异常,你将产品不存在的提示放在catch块中完全不符合逻辑,只有数据库连接失败、SQL执行报错这类系统异常才会进入catch分支
- 资源管理不规范:SqlConnection、SqlCommand、SqlDataReader都属于非托管资源,你没有做自动释放处理,长期运行会导致连接池占满、资源泄漏
- 连接关闭时机错误:在还未读取SqlDataReader的查询结果时就提前关闭了数据库连接,即使后续要读取数据也无法正常读取
修正后可运行代码
try { string constring = System.Configuration.ConfigurationManager.ConnectionStrings["WebDataBaseConnectionString"].ConnectionString; // using语句会在代码块执行结束后自动释放资源,无需手动调用Close() using (SqlConnection scon = new SqlConnection(constring)) { scon.Open(); // 仅查询存在性即可,不需要返回所有字段,性能更高 using (SqlCommand cmd = new SqlCommand("SELECT TOP 1 1 FROM Product WHERE Name=@Name AND Code=@Code", scon)) { // 增加Trim()过滤用户输入的前后空格,避免不必要的匹配失败 cmd.Parameters.AddWithValue("@Name", txtName.Text.Trim()); cmd.Parameters.AddWithValue("@Code", txtCode.Text.Trim()); object queryResult = cmd.ExecuteScalar(); if (queryResult != null) { Label1.Text = "该产品在我们的列表中,谢谢。"; } else { Label1.Text = "该产品不在我们的列表中,抱歉!"; } } } } catch (Exception ex) { // 异常分支仅处理系统错误,不用于业务判断 Label1.Text = $"查询异常,请稍后重试。错误信息:{ex.Message}"; }
额外优化说明
如果需要同时读取产品的其他字段信息,可以保留SqlDataReader的写法,判断dr.HasRows后调用dr.Read()读取对应字段即可,其余资源管理逻辑和上面保持一致。
内容的提问来源于stack exchange,提问作者farzaneh br
相关产品推荐
相关产品推荐

