Windows Forms应用查询MariaDB后如何在DataGridView显示数据?
解决Windows Forms中MariaDB搜索功能无法在DataGridView显示结果的问题
你的代码存在几个关键问题,导致搜索结果无法正常显示,以下是问题分析和修复方案:
核心问题点
- 参数未被正确传递:你创建了带参数的
MySqlCommand,但MySqlDataAdapter是直接用原始SQL字符串初始化的,完全没用到这个带参数的Command,导致参数根本没传入查询。 - SQL逻辑不符合需求:用
OR连接条件会导致只要任意一个文本框有值,就返回匹配该列的所有行;如果文本框为空,会匹配对应列值为空的行,而不是忽略该条件。 - 数值类型不匹配:
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
相关产品推荐
相关产品推荐

