try-catch异常失效问题:输入不存在词汇无报错提示求解决方案
问题解决建议:搜索无匹配时无反馈、Catch块未触发提示
核心问题分析
- 无匹配结果无反馈:当输入数据库不存在的词汇时,查询返回空结果,
reader.Read()返回false,循环不执行,但程序不会抛出异常,所以既不会进入catch块,也没有任何用户提示。 - Catch块未触发:Catch块仅在代码抛出运行时异常(如数据库连接失败、SQL语法错误等)时才会执行,无匹配结果不属于异常范畴,因此原代码的catch提示永远不会因“无结果”触发;同时原代码中
Con.Close()放在try块内,若执行中抛出异常,连接可能无法正常关闭。
解决方案步骤
1. 添加无匹配结果的用户提示
在读取数据后,通过reader.HasRows判断是否有查询结果,无结果时主动弹出提示。
2. 修复资源管理问题
使用using语句自动管理数据库连接、命令、阅读器资源,确保异常时资源也能正常释放,避免连接泄漏。
3. 修复SQL注入漏洞
原代码直接拼接用户输入到SQL语句,存在严重安全风险,改用参数化查询替代字符串拼接。
修改后的完整代码
try { // using语句自动管理连接资源,异常时也会自动关闭 using (SqlConnection Con = new SqlConnection(你的数据库连接字符串)) { Con.Open(); // 参数化查询,避免SQL注入 string query = "Select * from Medicine_tbl where MedName = @MedName"; using (SqlCommand comn = new SqlCommand(query, Con)) { // 添加查询参数 comn.Parameters.AddWithValue("@MedName", SearchTb.Text); using (SqlDataReader reader = comn.ExecuteReader()) { if (reader.HasRows) { while (reader.Read()) { Mednametb.Text = reader.GetValue(0).ToString(); Bptb.Text = reader.GetValue(1).ToString(); sptb.Text = reader.GetValue(2).ToString(); qtytb.Text = reader.GetValue(3).ToString(); companycb1.Text = reader.GetValue(4).ToString(); } } else { // 无匹配结果时给用户提示 MessageBox.Show("未找到匹配的药品信息"); } } } // using会自动关闭连接,无需手动调用Con.Close() } } catch (Exception ex) { MessageBox.Show("搜索出错: " + ex.Message); }
关键修改说明
- 无匹配反馈:通过
reader.HasRows判断查询结果,无结果时弹出提示框,解决输入不存在词汇无反应的问题。 - 资源安全:
using语句自动释放数据库相关资源,避免异常场景下的连接泄漏问题。 - 安全防护:参数化查询彻底避免SQL注入风险,提升代码安全性。
- 异常逻辑清晰:Catch块仅处理真正的运行异常(如连接失败、SQL错误等),此时弹出错误提示,符合异常处理的设计逻辑。
内容的提问来源于stack exchange,提问作者nik-trifonov
相关产品推荐
相关产品推荐

