如何解决用户控件内数据库搜索返回空结果的问题
问题修复方案
核心问题列表
- 动态创建的Label控件未添加到窗体控件集合,即使查询到数据界面也无法显示,容易误判为无返回结果
- 直接拼接SQL字符串,存在SQL注入风险,同时搜索内容含特殊字符(如单引号)时会导致SQL语法错误,返回空结果
- 每次触发搜索时未清空旧的动态控件,会出现控件重叠残留问题
- 连接字符串不完整,可能未正确连接到目标数据库或对应表
- 冗余的二进制读取代码未产生实际作用,占用额外资源
修复后的代码
using System.Data.SqlClient; SqlConnection cn; public Form1() { InitializeComponent(); // 补充完整连接字符串,替换为你的实际数据库路径 cn = new SqlConnection(@"Data Source=(LocalDB);AttachDbFilename=你的数据库完整路径.mdf;Integrated Security=True"); } private void Form1_Load(object sender, EventArgs e) { GetData(); } private void GetData() { // 提前清空之前动态添加的Label,建议提前在窗体拖入一个Panel容器专门存放动态控件 foreach (Control c in panel1.Controls) { c.Dispose(); } panel1.Controls.Clear(); int labelTop = 10; // 控制Label垂直位置,避免重叠 try { cn.Open(); // 使用参数化查询避免注入和语法错误 string sql = "Select * from Bills where billname like @SearchContent"; SqlCommand cm = new SqlCommand(sql, cn); cm.Parameters.AddWithValue("@SearchContent", "%" + txtSearch.Text + "%"); SqlDataReader dr = cm.ExecuteReader(); while (dr.Read()) { Label name = new Label(); name.Text = dr["billname"].ToString(); name.Top = labelTop; name.Left = 10; panel1.Controls.Add(name); Label descrip = new Label(); descrip.Text = dr["billdescrip"].ToString(); descrip.Top = labelTop; descrip.Left = 150; panel1.Controls.Add(descrip); Label amount = new Label(); amount.Text = dr["billamount"].ToString(); amount.Top = labelTop; amount.Left = 350; panel1.Controls.Add(amount); labelTop += 30; } dr.Close(); } catch (Exception ex) { MessageBox.Show("查询出错:" + ex.Message); } finally { if (cn.State == System.Data.ConnectionState.Open) { cn.Close(); } } } private void txtSearch_TextChanged(object sender, EventArgs e) { GetData(); }
验证步骤
- 先在数据库管理工具执行测试SQL
Select * from Bills where billname like '%测试关键词%',确认SQL和数据本身没有问题 - 确认连接字符串中的数据库路径、认证信息配置正确
- 若未使用Panel容器,可直接修改为操作this.Controls,注意增加标识避免误删窗体固定控件
内容的提问来源于stack exchange,提问作者Forever Unknown Nicholas
相关产品推荐
相关产品推荐

