如何删除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
相关产品推荐
相关产品推荐

