C#中用单条SELECT查询填充多个ComboBox异常:仅第一个被填充
问题分析与解决方案
嗨,我一眼就发现问题所在了——你的while循环没有用大括号包裹所有需要重复执行的代码!
问题根源
当前代码中,while(reader.Read())后面直接紧跟了cmbcoursecode.Items.Add(reader.GetString(1));,这意味着只有这一行代码会在每次循环迭代中执行。而cmbcoursedesc.Items.Add(reader.GetString(2));只会在整个循环结束后执行一次,自然只有第一个ComboBox能被正确填充。
修正后的代码
private void loadcourses() { try { using (sqlcon) { sqlcon.Open(); coursecmd = new SqlCommand("SELECT * FROM DegCourses", sqlcon); // 用using包裹SqlDataReader,自动释放资源 using (SqlDataReader reader = coursecmd.ExecuteReader()) { if (reader.HasRows) { // 用大括号包裹循环内所有操作 while(reader.Read()) { cmbcoursecode.Items.Add(reader.GetString(1)); cmbcoursedesc.Items.Add(reader.GetString(2)); } } } } } catch (Exception ex) { // 捕获异常时输出错误信息,方便调试 MessageBox.Show($"加载课程数据失败:{ex.Message}"); } }
额外建议
- 始终用
using语句包裹SqlDataReader,确保数据库资源被正确释放,避免内存泄漏。 - 不要空捕获异常,至少输出错误信息,这样出现问题时能快速定位原因。
- 建议不要用
SELECT *,而是明确指定需要的列名(比如SELECT CourseCode, CourseDesc FROM DegCourses),这样代码更清晰,也能避免因表结构变更导致的索引错误。
内容的提问来源于stack exchange,提问作者user9153800
相关产品推荐
相关产品推荐

