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

C#实现从MySQL查询数据填充文本框及SQL语法错误修复

报错修复方案

直接报错原因

SQL语法错误是因为表名使用了单引号包裹导致的,MySQL/MariaDB的语法规则中:

  • 单引号'仅用于包裹字符串类型的取值
  • 表名、字段名这类标识符如果需要转义,要使用反引号 `,不需要转义的情况下可以直接写表名不加任何符号
    你代码中SELECT * FROM 'tbl_phonebook'里的'tbl_phonebook'用单引号包表名,直接触发了语法校验失败。

其他必须修复的风险问题

  • 直接拼接cid.Text到SQL语句存在严重SQL注入漏洞,攻击者可以通过输入特殊字符串删库、拖库,必须改用参数化查询
  • 数据库连接、命令、数据读取器对象未做资源释放处理,一旦代码运行中途报错会导致连接泄漏,建议使用using语句自动管理资源释放
  • TextChanged事件会在你每输入一个字符就触发一次查询,输入未完成时很容易触发无效查询报错,建议改为输入完成后按回车/点击查询按钮触发,若必须保留TextChanged触发逻辑可以加300ms左右的防抖逻辑

修复后的代码

private void textBox1_TextChanged(object sender, EventArgs e)
{       
    // 输入合法性校验,避免无效查询
    if(string.IsNullOrWhiteSpace(cid.Text) || !int.TryParse(cid.Text, out _))
    {
        name.Text = address.Text = contact.Text = email.Text = string.Empty;
        return;
    }
    
    string sqlstring = "database = db_phonebook; user = root; password = ''; server = 'localhost'; SSL Mode = None";
    // using自动释放连接资源,无需手动调用Close
    using MySqlConnection mysqlcon = new MySqlConnection(sqlstring);
    mysqlcon.Open();
    
    // 表名去掉单引号,查询参数用@cid占位
    string selectquery = "SELECT * FROM tbl_phonebook WHERE CID = @cid";
    using MySqlCommand mysqlcom = new MySqlCommand(selectquery, mysqlcon);
    // 参数化赋值,自动规避SQL注入风险
    mysqlcom.Parameters.AddWithValue("@cid", cid.Text);
    
    using MySqlDataReader mdr = mysqlcom.ExecuteReader();
    if (mdr.Read())
    {
        name.Text = mdr.GetString("Name");
        address.Text = mdr.GetString("Address");
        contact.Text = mdr.GetString("Contact_Number");
        email.Text = mdr.GetString("Email_Address");
    }
    else
    {
        // 可选:替换为文本提示避免频繁弹窗干扰输入
        // MessageBox.Show("Record Not Found!");
        name.Text = address.Text = contact.Text = email.Text = "无匹配记录";
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:54:02