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

C# WinForm读取SQL Server指定列到DataGridView遇索引越界异常

问题分析与解决方案

错误翻译

System.IndexOutOfRangeException:索引超出了数组界限。

导致错误的核心原因

  1. 变量名不匹配:代码中创建了cmd2,但执行的是cmd1.ExecuteReader(),变量引用错误,要么cmd1未初始化触发异常,要么执行了无关命令导致数据异常。
  2. DataGridView行未预先创建:直接访问marks_datagrid3.Rows[0]到Rows[7],但如果DataGridView没有预先添加至少8行,就会触发索引越界异常。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:42:37