如何通过DataGridView实现批量删除数据库及控件中的多行数据
解决DataGridView选中多行同步删除数据库数据的问题
你的代码存在两个核心问题:
- 仅获取了第一个选中行的ID值,循环里每次创建
FbCommand但始终用这个固定ID作为删除条件; - 循环过程中没有执行删除操作,最后只执行了一次
ExecuteNonQuery(),自然只会删除一条数据。
正确实现方式
方式1:逐行删除(带事务+参数化)
适合选中行数不多的场景,通过事务保证操作原子性,同时用参数化查询避免SQL注入:
private void button2_Click(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count == 0) return; try { // 开启事务,确保删除操作要么全成功要么全回滚 using (var transaction = connection.BeginTransaction()) { foreach (DataGridViewRow item in dataGridView1.SelectedRows) { // 跳过DataGridView的默认新行 if (item.IsNewRow) continue; string id = item.Cells[0].Value.ToString(); // 参数化查询,避免SQL注入和语法错误 using (FbCommand cmd = new FbCommand($"DELETE FROM {nameTable} WHERE id = @Id", connection, transaction)) { cmd.Parameters.AddWithValue("@Id", id); cmd.ExecuteNonQuery(); } // 同步移除DataGridView中的该行 dataGridView1.Rows.Remove(item); } transaction.Commit(); // 若有自定义刷新方法可在此调用 // Update(); } } catch (Exception ex) { MessageBox.Show($"删除失败:{ex.Message}"); } }
方式2:批量删除(高效版)
如果选中行数较多,推荐用批量删除减少数据库交互次数:
private void button2_Click(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count == 0) return; try { // 收集所有选中行的ID List<string> ids = new List<string>(); foreach (DataGridViewRow item in dataGridView1.SelectedRows) { if (item.IsNewRow) continue; ids.Add(item.Cells[0].Value.ToString()); } // 拼接参数化的IN条件 string paramPlaceholders = string.Join(", ", ids.Select((_, idx) => $"@Id{idx}")); string sql = $"DELETE FROM {nameTable} WHERE id IN ({paramPlaceholders})"; using (FbCommand cmd = new FbCommand(sql, connection)) { // 添加对应参数 for (int i = 0; i < ids.Count; i++) { cmd.Parameters.AddWithValue($"@Id{i}", ids[i]); } cmd.ExecuteNonQuery(); } // 从后往前移除选中行,避免索引错乱 for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--) { DataGridViewRow row = dataGridView1.SelectedRows[i]; if (!row.IsNewRow) dataGridView1.Rows.Remove(row); } // Update(); } catch (Exception ex) { MessageBox.Show($"删除失败:{ex.Message}"); } }
关键注意事项
- 参数化查询:禁止用字符串拼接SQL,否则会引发SQL注入风险,还可能因ID含特殊字符导致语法错误;
- 事务处理:逐行删除时必须用事务,防止部分删除成功、部分失败导致数据不一致;
- 跳过新行:默认DataGridView会显示空行用于新增数据,必须跳过该行避免无效删除操作;
- 界面同步:删除数据库数据后,要同步移除DataGridView中的对应行,保证界面数据与数据库一致。
内容的提问来源于stack exchange,提问作者John B
相关产品推荐
相关产品推荐

