C#中LIKE查询用法及ComboBox联动TextBox搜索BUG修复咨询
问题分析与解决方案
嘿,我来帮你搞定这两个问题——先解决你遇到的搜索BUG,再聊聊C#里用LIKE查询的正确姿势!
1. 修复搜索结果混入其他职位的BUG
你的核心问题出在SQL逻辑运算符的优先级上:AND的优先级比OR高,所以原来的WHERE子句会被数据库解析成:
FirstName LIKE 'xxx%' OR MiddleName LIKE 'xxx%' OR (LastName LIKE 'xxx%' AND Position LIKE 'xxx%')
这就导致只要FirstName或MiddleName匹配输入的字符,不管职位是否符合ComboBox的选中值,都会被查出来。
解决思路:给名字查询条件加括号
把三个名字的LIKE查询用括号包裹,确保它们作为一个整体,再和职位条件用AND连接,正确的逻辑应该是:
(FirstName LIKE @searchText% OR MiddleName LIKE @searchText% OR LastName LIKE @searchText%) AND Position LIKE @position%
2. 必须替换为参数化查询(重中之重)
你现在直接把TextBox和ComboBox的文本拼接进SQL语句,这会导致SQL注入漏洞——攻击者可以通过输入恶意字符篡改你的SQL逻辑,甚至删除整个数据库。同时,参数化查询还能避免字符串格式问题(比如姓名里包含单引号的情况)。
3. 优化后的完整代码
我把你的代码重构了一下,提取了重复的数据加载逻辑,同时用参数化查询替换了字符串拼接:
// 提取通用的加载员工数据方法,减少重复代码 private void LoadEmployeeData(string sqlQuery, params MySqlParameter[] parameters) { using (MySqlDataAdapter sda = new MySqlDataAdapter(sqlQuery, con)) { if (parameters != null) { sda.SelectCommand.Parameters.AddRange(parameters); } DataTable data = new DataTable(); sda.Fill(data); dataGridView1.DataSource = data; } } private void textBox1_TextChanged(object sender, EventArgs e) { if (string.IsNullOrEmpty(textBox1.Text)) { // 文本框为空时,加载所有活跃员工 LoadEmployeeData("Select * from employee where Pstatus='Active'"); } else { // 文本框有内容时,按职位+名字前缀搜索 string sql = @"SELECT `empID`, `FirstName`, `MiddleName`, `LastName`, `Gender`, `Address`, `Zipcode`, `Position`, `Rate`, `DateHired`, `TelNo`, `empSched`, `Pstatus`, `AllowanceID`, `image`, `Red` FROM `employee` WHERE (FirstName LIKE @searchText OR MiddleName LIKE @searchText OR LastName LIKE @searchText) AND Position LIKE @position AND Pstatus='Active'"; // 加上活跃状态,和空文本时的逻辑保持一致 MySqlParameter[] parameters = new MySqlParameter[] { new MySqlParameter("@searchText", $"{textBox1.Text}%"), new MySqlParameter("@position", $"{comboBox1.Text}%") }; LoadEmployeeData(sql, parameters); } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { // 下拉框选中时,加载对应职位的活跃员工 string sql = @"SELECT `empID`, `FirstName`, `MiddleName`, `LastName`, `Gender`, `Address`, `Zipcode`, `Position`, `Rate`, `DateHired`, `TelNo`, `empSched`, `Pstatus`, `AllowanceID`, `image`, `Red` FROM `employee` WHERE Position LIKE @position AND Pstatus='Active'"; MySqlParameter[] parameters = new MySqlParameter[] { new MySqlParameter("@position", $"{comboBox1.Text}%") }; LoadEmployeeData(sql, parameters); }
关于C#中使用LIKE查询的总结
- 逻辑优先级要注意:当OR和AND混合使用时,一定要用括号明确分组,避免逻辑错误。
- 永远用参数化查询:不要直接拼接用户输入到SQL语句中,参数化是安全且可靠的方式。
- 通配符的处理:可以在参数值里添加
%通配符(比如$"{textBox1.Text}%"),也可以在SQL语句里写LIKE @searchText%,两种方式都可以,前者更灵活。
内容的提问来源于stack exchange,提问作者newb
相关产品推荐
相关产品推荐

