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

Windows Forms应用查询MariaDB后如何在DataGridView显示数据?

解决Windows Forms中MariaDB搜索功能无法在DataGridView显示结果的问题

你的代码存在几个关键问题,导致搜索结果无法正常显示,以下是问题分析和修复方案:

核心问题点

  1. 参数未被正确传递:你创建了带参数的MySqlCommand,但MySqlDataAdapter是直接用原始SQL字符串初始化的,完全没用到这个带参数的Command,导致参数根本没传入查询。
  2. SQL逻辑不符合需求:用OR连接条件会导致只要任意一个文本框有值,就返回匹配该列的所有行;如果文本框为空,会匹配对应列值为空的行,而不是忽略该条件。
  3. 数值类型不匹配:duzinaM、precnikCM这类数值列直接传入字符串参数,可能引发类型转换错误。

修复后的完整代码

private void btnPretraga_Click(object sender, EventArgs e)
{
    string connString = ConfigurationManager.ConnectionStrings["MariaDBConnectionString"].ConnectionString;
    using (MySqlConnection konekcija = new MySqlConnection(connString))
    {
        konekcija.Open();
        // 动态构建SQL,仅添加有输入的条件
        StringBuilder sqlBuilder = new StringBuilder("SELECT * FROM drvnisortiment WHERE 1=1");
        MySqlCommand cmd = new MySqlCommand(sqlBuilder.ToString(), konekcija);

        // 处理木材类型(文本模糊匹配)
        if (!string.IsNullOrWhiteSpace(vrstaDrvetatextBox.Text))
        {
            sqlBuilder.Append(" AND vrstaDrveta LIKE @VrstaDrveta");
            cmd.Parameters.AddWithValue("@VrstaDrveta", $"%{vrstaDrvetatextBox.Text}%");
        }

        // 处理长度(数值类型验证)
        if (double.TryParse(duzinaMtextBox.Text, out double duzina))
        {
            sqlBuilder.Append(" AND duzinaM = @DuzinaM");
            cmd.Parameters.AddWithValue("@DuzinaM", duzina);
        }

        // 处理直径(数值类型验证)
        if (int.TryParse(precnikCMtextBox.Text, out int precnik))
        {
            sqlBuilder.Append(" AND precnikCM = @PrecnikCM");
            cmd.Parameters.AddWithValue("@PrecnikCM", precnik);
        }

        // 处理等级(文本模糊匹配)
        if (!string.IsNullOrWhiteSpace(klasatextBox.Text))
        {
            sqlBuilder.Append(" AND klasa LIKE @Klasa");
            cmd.Parameters.AddWithValue("@Klasa", $"%{klasatextBox.Text}%");
        }

        // 处理许可证编号(文本模糊匹配)
        if (!string.IsNullOrWhiteSpace(redniBrDoznaketextBox.Text))
        {
            sqlBuilder.Append(" AND redniBrDoznake LIKE @RedniBrDoznake");
            cmd.Parameters.AddWithValue("@RedniBrDoznake", $"%{redniBrDoznaketextBox.Text}%");
        }

        // 处理使用类型(文本模糊匹配)
        if (!string.IsNullOrWhiteSpace(vrstaSlUzitkatextBox.Text))
        {
            sqlBuilder.Append(" AND vrstaSlUzitka LIKE @VrstaSlUzitka");
            cmd.Parameters.AddWithValue("@VrstaSlUzitka", $"%{vrstaSlUzitkatextBox.Text}%");
        }

        // 更新Command的SQL语句
        cmd.CommandText = sqlBuilder.ToString();

        // 用带参数的Command初始化DataAdapter
        MySqlDataAdapter SDA = new MySqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        SDA.Fill(dt);

        // 绑定到DataGridView
        drvniSortimentGridView.DataSource = dt;
    }
}

关键修复说明

  • 动态条件拼接:用StringBuilder构建SQL,只有当文本框有有效输入时才添加对应条件,空文本框自动忽略该列的匹配,1=1作为基础条件方便后续拼接AND。
  • 参数关联:直接用已添加参数的MySqlCommand初始化MySqlDataAdapter,确保参数被正确传递到查询中。
  • 数值类型处理:对数值列先做类型转换验证,避免字符串转数值的报错,只有输入有效数值时才添加该条件。
  • 模糊匹配优化:对文本列使用LIKE和通配符%,支持部分内容搜索;如果需要精确匹配,将LIKE改为=并去掉%即可。
  • 简化数据源:用DataTable代替DataSet,绑定逻辑更简洁,效果一致。

额外注意事项

  • 确认界面上的文本框名称和代码中的变量名完全一致。
  • 检查数据库连接字符串的正确性,确保应用能正常连接MariaDB。
  • 如果需要区分大小写匹配,可在SQL中添加COLLATE关键字(比如vrstaDrveta LIKE @VrstaDrveta COLLATE utf8mb4_bin)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:36:12