如何批量更新单列多行数据?遇索引越界错误求解决
问题分析与解决
错误原因
你遇到的「索引超出范围,必须非负且小于集合大小」错误,核心问题是遍历对象和访问对象不匹配:
- 你循环的是
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
相关产品推荐
相关产品推荐

