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

如何批量更新单列多行数据?遇索引越界错误求解决

问题分析与解决

错误原因

你遇到的「索引超出范围,必须非负且小于集合大小」错误,核心问题是遍历对象和访问对象不匹配:

  • 你循环的是dgvDisplay.Rows(表格所有行),但每次取的是dgvDisplay.SelectedRows[i](选中行集合)。
  • 当表格总行数多于选中行数时,i递增到超过SelectedRows的元素数量,自然触发索引越界。

两种修正方案(按需选择)

方案1:更新所有行对应的数据库记录

如果目标是把表中所有记录的Status改成2,直接执行单条批量更新语句即可,效率更高:

if (MessageBox.Show("确认要执行更新吗?", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
    using (var cn = new SqlConnection("你的数据库连接字符串"))
    {
        cn.Open();
        var cmd = new SqlCommand("UPDATE CCSDD_StoreDirectDelivery1 SET Status = 2", cn);
        cmd.ExecuteNonQuery();
    }
    MessageBox.Show("状态已全部更新!");
}

方案2:只更新选中行对应的记录

如果仅需更新表格中选中的行,要循环SelectedRows而非所有Rows,同时修复SQL注入和连接管理问题:

if (MessageBox.Show("确认要执行更新吗?", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
    using (var cn = new SqlConnection("你的数据库连接字符串"))
    {
        cn.Open();
        var cmdText = "UPDATE CCSDD_StoreDirectDelivery1 SET Status = 2 WHERE DR# = @DrNumber";
        using (var cmd = new SqlCommand(cmdText, cn))
        {
            cmd.Parameters.Add("@DrNumber", SqlDbType.VarChar);
            foreach (DataGridViewRow row in dgvDisplay.SelectedRows)
            {
                if (row.IsNewRow) continue;
                var drNumber = row.Cells[1].Value?.ToString();
                if (!string.IsNullOrEmpty(drNumber))
                {
                    cmd.Parameters["@DrNumber"].Value = drNumber;
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
    MessageBox.Show("选中行状态已更新!");
}

额外注意点

  • 避免SQL注入:直接拼接SQL字符串存在安全风险,必须使用参数化查询。
  • 连接安全管理:用using语句自动释放连接,避免手动开关导致的连接泄漏。
  • 空值判断:提前检查单元格值是否为空,防止ToString()触发空引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:15:47