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

如何删除DataGridView中已勾选行对应的SQL Server数据库记录?

Got it!要实现DataGridView勾选行删除SQL Server数据的功能,咱们一步步来,核心是先拿到勾选的行主键,再安全地执行数据库删除,最后同步界面:

实现步骤

1. 收集已勾选行的数据库主键

首先得遍历DataGridView,找出Selector列被勾选的行,并且提取这些行对应的数据库主键(比如ID,你的表必须有唯一主键,否则没法精准删除)。代码示例:

// 收集勾选行的主键值(替换成你的主键列名,比如ID)
List<int> selectedIds = new List<int>();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    // 跳过未提交的新行
    if (row.IsNewRow) continue;
    
    bool isChecked = Convert.ToBoolean(row.Cells["Selector"].Value);
    if (isChecked)
    {
        // 这里假设主键是int类型,根据实际类型调整(比如string)
        int id = Convert.ToInt32(row.Cells["ID"].Value);
        selectedIds.Add(id);
    }
}

// 没有勾选行的话直接提示
if (selectedIds.Count == 0)
{
    MessageBox.Show("请先勾选要删除的行哦!");
    return;
}

2. 用参数化查询执行数据库删除

一定要用参数化查询,绝对不能直接拼接SQL字符串——这是防止SQL注入的关键,也是数据库操作的安全规范。下面是完整的删除逻辑:

// 替换成你的数据库连接字符串(建议放在app.config里,不要硬编码)
string connectionString = "Server=你的服务器地址;Database=你的数据库名;Trusted_Connection=True;";
string tableName = "你的表名"; // 替换成实际表名

// 构建参数化的DELETE语句
StringBuilder deleteQuery = new StringBuilder($"DELETE FROM {tableName} WHERE ID IN (");
// 逐个添加参数占位符
for (int i = 0; i < selectedIds.Count; i++)
{
    deleteQuery.Append($"@Id{i},");
}
// 去掉最后一个逗号,补全语句
deleteQuery.Remove(deleteQuery.Length - 1, 1);
deleteQuery.Append(")");

using (SqlConnection conn = new SqlConnection(connectionString))
{
    using (SqlCommand cmd = new SqlCommand(deleteQuery.ToString(), conn))
    {
        // 给每个参数赋值
        for (int i = 0; i < selectedIds.Count; i++)
        {
            cmd.Parameters.AddWithValue($"@Id{i}", selectedIds[i]);
        }

        try
        {
            conn.Open();
            int deletedCount = cmd.ExecuteNonQuery();
            MessageBox.Show($"成功删除 {deletedCount} 条数据!");

            // 删除后同步DataGridView界面,两种方式选其一:
            // 方式1:重新查询数据库,刷新数据源(适合数据可能被其他地方修改的场景)
            // RefreshDataGridView(); // 你自己实现的重新绑定数据的方法

            // 方式2:直接从绑定的DataTable中移除勾选行(更高效,无需再次查询)
            for (int i = dataGridView1.Rows.Count - 1; i >= 0; i--)
            {
                DataGridViewRow row = dataGridView1.Rows[i];
                if (!row.IsNewRow && Convert.ToBoolean(row.Cells["Selector"].Value))
                {
                    ((DataTable)dataGridView1.DataSource).Rows.RemoveAt(i);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"删除失败:{ex.Message}");
        }
    }
}

3. 关键注意事项

  • 主键必须存在:你的SQL Server表一定要有唯一主键(比如自增ID),否则无法精准定位要删除的行,容易误删数据。
  • 事务处理(可选):如果需要保证多行删除的原子性(要么全删成功,要么全不删),可以加上事务:
    using (SqlTransaction tran = conn.BeginTransaction())
    {
        cmd.Transaction = tran;
        try
        {
            int deletedCount = cmd.ExecuteNonQuery();
            tran.Commit();
            MessageBox.Show($"成功删除 {deletedCount} 条数据!");
            // 更新界面...
        }
        catch (Exception ex)
        {
            tran.Rollback();
            MessageBox.Show($"删除失败,已回滚操作:{ex.Message}");
        }
    }
    
  • 处理数据类型:如果你的主键是string或者其他类型,记得调整代码里的类型转换逻辑,比如Convert.ToString(row.Cells["ID"].Value)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:33:44