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
相关产品推荐
相关产品推荐

