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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:13:51