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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:30:00