C# WinForm读取SQL Server指定列到DataGridView遇索引越界异常
问题分析与解决方案
错误翻译
System.IndexOutOfRangeException:索引超出了数组界限。
导致错误的核心原因
- 变量名不匹配:代码中创建了
cmd2,但执行的是cmd1.ExecuteReader(),变量引用错误,要么cmd1未初始化触发异常,要么执行了无关命令导致数据异常。 - DataGridView行未预先创建:直接访问
marks_datagrid3.Rows[0]到Rows[7],但如果DataGridView没有预先添加至少8行,就会触发索引越界异常。 - SQL注入风险:直接拼接用户输入到SQL语句中,存在严重安全漏洞。
修复后的代码
// 使用参数化查询避免SQL注入 string query2 = "select RollNo,Computer,Chemistry,Physics,Maths,English,Islamiat,Urdu,PakStudy from marks where RollNo=@RollNo;"; using (SqlCommand cmd2 = new SqlCommand(query2, con)) { // 添加参数,绑定用户输入 cmd2.Parameters.AddWithValue("@RollNo", textBox1.Text); try { con.Open(); using (SqlDataReader read2 = cmd2.ExecuteReader()) { // 清空DataGridView现有行 marks_datagrid3.Rows.Clear(); // 检查是否有匹配数据 if (read2.Read()) { // 动态添加行,无需预先创建 marks_datagrid3.Rows.Add("计算机", read2["Computer"].ToString()); marks_datagrid3.Rows.Add("化学", read2["Chemistry"].ToString()); marks_datagrid3.Rows.Add("物理", read2["Physics"].ToString()); marks_datagrid3.Rows.Add("数学", read2["Maths"].ToString()); marks_datagrid3.Rows.Add("英语", read2["English"].ToString()); marks_datagrid3.Rows.Add("伊斯兰研究", read2["Islamiat"].ToString()); marks_datagrid3.Rows.Add("乌尔都语", read2["Urdu"].ToString()); marks_datagrid3.Rows.Add("巴基斯坦研究", read2["PakStudy"].ToString()); } else { MessageBox.Show("未找到对应学号的成绩"); } } } catch (Exception ex) { MessageBox.Show("错误:" + ex.Message); } finally { // 确保数据库连接关闭 if (con.State == ConnectionState.Open) { con.Close(); } } }
额外说明
- 用
using语句包裹SqlCommand和SqlDataReader,自动释放资源,避免数据库连接泄漏。 - 参数化查询彻底杜绝SQL注入风险,同时避免字符串拼接导致的语法错误。
- 动态添加DataGridView行,从根源上解决索引越界问题,无需手动预先创建行。
- 添加异常捕获和连接关闭逻辑,提升代码稳定性和容错性。
内容的提问来源于stack exchange,提问作者Meraj Aslam
相关产品推荐
相关产品推荐

