C#如何避免多if语句,通过ComboBox选月份过滤MySQL数据
优化C#中ComboBox月份筛选MySQL数据的代码
你当前的实现需要为每个月份编写重复的if分支,不仅冗余还难以维护,以下是几种简洁的优化方案:
1. 单月份筛选:动态参数化查询(推荐)
直接利用ComboBox的选中文本构建参数化查询,无需编写多个if分支,同时避免SQL注入风险:
// 获取ComboBox选中的月份文本 string selectedMonth = combox.Text.Trim(); // 构建参数化查询(注意:MySQL需使用MySqlDataAdapter而非SqlDataAdapter) string query = "SELECT * FROM mytable WHERE Month LIKE CONCAT('%', @MonthName)"; using (MySqlDataAdapter sda = new MySqlDataAdapter(query, con)) { // 添加参数,防止SQL注入 sda.SelectCommand.Parameters.AddWithValue("@MonthName", selectedMonth); DataSet dataSet = new DataSet(); sda.Fill(dataSet); // 绑定到DataGridView时指定具体表,避免DataSet多表问题 table.DataSource = dataSet.Tables[0]; }
2. 多月份筛选:动态拼接参数化条件
如果ComboBox支持多选(设置SelectionMode为MultiSimple或MultiExtended),可以自动拼接OR条件,无需硬编码月份:
// 获取所有选中的月份 var selectedMonths = combox.SelectedItems.Cast<string>().ToList(); // 无选中项时显示全部数据 if (selectedMonths.Count == 0) { string query = "SELECT * FROM mytable"; using (MySqlDataAdapter sda = new MySqlDataAdapter(query, con)) { DataSet dataSet = new DataSet(); sda.Fill(dataSet); table.DataSource = dataSet.Tables[0]; } return; } // 构建参数化条件集合 var paramList = new List<MySqlParameter>(); var conditionList = new List<string>(); for (int i = 0; i < selectedMonths.Count; i++) { string paramName = $"@Month{i}"; conditionList.Add($"Month LIKE CONCAT('%', {paramName})"); paramList.Add(new MySqlParameter(paramName, selectedMonths[i])); } // 拼接最终查询语句 string query = $"SELECT * FROM mytable WHERE {string.Join(" OR ", conditionList)}"; using (MySqlDataAdapter sda = new MySqlDataAdapter(query, con)) { sda.SelectCommand.Parameters.AddRange(paramList.ToArray()); DataSet dataSet = new DataSet(); sda.Fill(dataSet); table.DataSource = dataSet.Tables[0]; }
额外优化建议
- 绑定月份列表到ComboBox:提前定义月份列表并绑定,避免手动输入的拼写错误:
var monthList = new List<string> { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; combox.DataSource = monthList; - 使用
using语句管理资源:确保数据库连接、DataAdapter等对象自动释放,避免资源泄漏。 - 替换SQL Server类库:连接MySQL时务必使用
MySql.Data.MySqlClient命名空间下的类,不要误用SQL Server的SqlDataAdapter。
内容的提问来源于stack exchange,提问作者echooooslam
相关产品推荐
相关产品推荐

