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

C#中通过Select筛选MySQL当前年份数据并加载到ComboBox的实现

问题排查

1. 程序冻结的直接原因:死循环

你代码中内层用了while (year2 == year4)做判断,只要两个年份相等,这个循环的条件永远成立,会无限往ComboBox中插入同一条讲座标题,CPU占满后直接导致程序无响应。这里只需要做一次匹配判断,应该把while替换成if。

2. 其他逻辑缺陷

  • 日期处理逻辑脆弱:通过字符串截取的方式获取年份严重依赖日期格式化规则,一旦系统区域设置变化、或者数据库存储的日期字符串格式有变动,就会出现年份截取错误。
  • 数据筛选效率低:直接全量查询所有讲座记录再在C#层面过滤年份,数据量大时性能极差,完全可以在SQL查询阶段就完成年份筛选,减少不必要的数据传输和遍历。
  • 数据库资源未安全释放:硬编码的连接开闭逻辑容易在异常场景下出现资源泄漏,推荐用using语句自动管理连接、命令、DataReader的生命周期。

修复后的代码

private void Form4_Load(object sender, EventArgs e)
{
    // 直接获取数值类型的当前年份,无需字符串处理
    int currentYear = DateTime.Now.Year;
    // 连接字符串建议从配置文件读取,此处仅做示例
    string connStr = "你的MySQL数据库连接字符串";
    
    try
    {
        // using语句会在代码块结束后自动释放连接资源,无需手动写finally关闭
        using (MySqlConnection con = new MySqlConnection(connStr))
        {
            con.Open();
            // SQL层面直接用YEAR函数筛选当年记录,无需在应用层做过滤
            MySqlCommand busca_palestra = new MySqlCommand(
                "SELECT tituloPalestra FROM Palestras WHERE YEAR(diaPalestra) = @currentYear", 
                con);
            // 参数化查询避免SQL注入,同时消除类型转换风险
            busca_palestra.Parameters.AddWithValue("@currentYear", currentYear);
            
            using (MySqlDataReader resultado = busca_palestra.ExecuteReader())
            {
                // 先清空下拉框原有选项避免重复
                comboBox1.Items.Clear();
                // SQL已完成筛选,直接遍历结果集添加即可
                while (resultado.Read())
                {
                    comboBox1.Items.Add(resultado["tituloPalestra"].ToString());
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"加载讲座数据失败:{ex.Message}");
    }
}

额外优化建议

如果diaPalestra字段是MySQL原生的DATE/DATETIME类型,用内置YEAR()函数提取年份是最稳妥的方案,不需要在应用层做任何字符串格式适配。数据量较大时可以把数据加载逻辑放到异步方法中执行,避免窗体加载时出现短时间卡顿。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:36:07