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

如何实现textbox按键变化时从两关联表选定列模糊搜索数据

实现方案

前置说明

你当前的代码存在2个可优化点:

  1. SQL语句拼接时缺少空格,会触发语法报错
  2. 直接把用户输入拼入SQL存在SQL注入风险,需要改为参数化查询

实现步骤

1. 定义允许搜索的字段白名单

首先在窗体类中定义字段映射字典,避免用户传入非法字段名引发SQL注入,key为界面展示给用户的字段名,value为数据库中对应的字段表达式:

// 可根据实际需求增减支持搜索的字段
private Dictionary<string, string> _searchFieldMap = new Dictionary<string, string>()
{
    {"员工ID", "a.Emp_ID"},
    {"员工名", "e.Firstname"},
    {"员工姓", "e.Lastname"},
    {"出勤日期", "a.Date"},
    {"上班打卡时间", "a.Time_In"},
    {"下班打卡时间", "a.Time_Out"}
};

你可以把字典的key绑定到下拉选择框,供用户选择要搜索的字段。

2. 改造搜索方法

修改searchData方法,支持传入选定的搜索字段,同时改为参数化查询:

public void searchData(string valuetoFind, string selectedField)
{
    // 校验选定字段合法性
    if (!_searchFieldMap.TryGetValue(selectedField, out string dbField))
    {
        MessageBox.Show("请选择合法的搜索字段");
        return;
    }

    myconnection.Connection_db();
    // 修正原SQL的空格问题,使用参数占位符
    string query = $@"SELECT a.Date, a.Emp_ID, e.Firstname, e.Lastname, a.Time_In, a.Time_Out 
                      FROM attendance a 
                      INNER JOIN emp_list e ON e.Emp_ID = a.Emp_ID
                      WHERE {dbField} LIKE @searchValue";
    try
    {
        MySqlCommand cmd = new MySqlCommand(query, Connection.conn);
        // 给参数赋值,前后拼接%实现模糊匹配
        cmd.Parameters.AddWithValue("@searchValue", $"%{valuetoFind}%");
        MySqlDataAdapter msda = new MySqlDataAdapter(cmd);
        DataTable dtbl = new DataTable();
        msda.Fill(dtbl);
        dgvattend.DataSource = dtbl;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

3. 文本框事件调用

在textbox的文本变更事件中,获取用户输入的搜索值和选定的字段,调用改造后的搜索方法即可:

private void 你的搜索文本框名_TextChanged(object sender, EventArgs e)
{
    string searchValue = 你的搜索文本框名.Text.Trim();
    string selectedField = 你的字段选择下拉框名.SelectedItem?.ToString();
    // 若用户未选择字段,默认用第一个字段搜索
    if (string.IsNullOrEmpty(selectedField))
    {
        selectedField = _searchFieldMap.Keys.First();
    }
    searchData(searchValue, selectedField);
}

扩展说明

  • 如果你不需要用户选字段,要实现输入内容匹配所有字段,直接修改WHERE条件即可,不需要传入selectedField参数:
    WHERE CONCAT_WS('|',a.Emp_ID, e.Firstname, e.Lastname, a.Date, a.Time_In, a.Time_Out) LIKE @searchValue
    
  • CONCAT_WS会自动跳过NULL值,避免拼接NULL导致匹配失效的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:36:04