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

如何在C# WinForm的SQL Client中实现软删除、恢复及永久删除

实现SQL Server软删除与永久删除(C# WinForms + SqlClient)

没问题,我帮你把软删除、恢复和永久删除的功能都理清楚,用纯SqlClient实现,完全适配WinForms场景:

一、软删除实现(标记为已删除)

软删除的核心是用IsDeleted字段(建议设为bit类型,0代表正常,1代表已删除)标记记录,而非直接删除。这里修正你之前的SQL语法问题,给出完整可运行的代码:

// 软删除指定ID的记录
private void SoftDeleteRow(int recordId)
{
    // 用using自动释放连接资源,避免连接泄漏
    using (SqlConnection conn1 = new SqlConnection("你的数据库连接字符串"))
    {
        conn1.Open();
        // 参数化SQL,防止注入攻击
        string sql = "UPDATE [你的表名] SET IsDeleted = 1 WHERE Id = @RecordId";
        using (SqlCommand cmd = new SqlCommand(sql, conn1))
        {
            cmd.Parameters.AddWithValue("@RecordId", recordId);
            int affectedRows = cmd.ExecuteNonQuery();
            
            // 反馈操作结果
            if (affectedRows > 0)
            {
                MessageBox.Show("软删除成功!");
            }
            else
            {
                MessageBox.Show("未找到要删除的记录!");
            }
        }
    }
}

二、恢复已软删除的行

恢复操作就是把IsDeleted改回0,建议加上AND IsDeleted = 1的条件,避免重复恢复正常记录:

// 恢复已标记为删除的记录
private void RestoreDeletedRow(int recordId)
{
    using (SqlConnection conn1 = new SqlConnection("你的数据库连接字符串"))
    {
        conn1.Open();
        string sql = "UPDATE [你的表名] SET IsDeleted = 0 WHERE Id = @RecordId AND IsDeleted = 1";
        using (SqlCommand cmd = new SqlCommand(sql, conn1))
        {
            cmd.Parameters.AddWithValue("@RecordId", recordId);
            int affectedRows = cmd.ExecuteNonQuery();
            
            if (affectedRows > 0)
            {
                MessageBox.Show("恢复成功!");
            }
            else
            {
                MessageBox.Show("该记录未被软删除或不存在!");
            }
        }
    }
}

三、永久删除(彻底删除)

永久删除就是直接删除记录,建议默认只删除已标记为软删除的记录,降低误删风险:

// 永久删除已软删除的记录
private void PermanentDeleteRow(int recordId)
{
    using (SqlConnection conn1 = new SqlConnection("你的数据库连接字符串"))
    {
        conn1.Open();
        // 仅删除已标记的记录,避免误删正常数据
        string sql = "DELETE FROM [你的表名] WHERE Id = @RecordId AND IsDeleted = 1";
        using (SqlCommand cmd = new SqlCommand(sql, conn1))
        {
            cmd.Parameters.AddWithValue("@RecordId", recordId);
            int affectedRows = cmd.ExecuteNonQuery();
            
            if (affectedRows > 0)
            {
                MessageBox.Show("永久删除成功!");
            }
            else
            {
                MessageBox.Show("该记录未被软删除或不存在!");
            }
        }
    }
}

如果业务需要允许永久删除正常记录,去掉AND IsDeleted = 1即可,但一定要在代码中加确认提示(比如弹框让用户确认),避免误操作。

四、查询数据时过滤软删除记录

平时查询正常数据时,必须加上WHERE IsDeleted = 0的条件,避免显示已删除的记录;如果是用于恢复的管理界面,可以查询所有记录:

// 查询正常数据(排除软删除)
private DataTable GetActiveRecords()
{
    DataTable dt = new DataTable();
    using (SqlConnection conn1 = new SqlConnection("你的数据库连接字符串"))
    {
        conn1.Open();
        string sql = "SELECT * FROM [你的表名] WHERE IsDeleted = 0";
        using (SqlDataAdapter da = new SqlDataAdapter(sql, conn1))
        {
            da.Fill(dt);
        }
    }
    return dt;
}

// 查询所有记录(包括已删除,用于恢复管理)
private DataTable GetAllRecords()
{
    DataTable dt = new DataTable();
    using (SqlConnection conn1 = new SqlConnection("你的数据库连接字符串"))
    {
        conn1.Open();
        string sql = "SELECT * FROM [你的表名]";
        using (SqlDataAdapter da = new SqlDataAdapter(sql, conn1))
        {
            da.Fill(dt);
        }
    }
    return dt;
}

五、关键注意事项

  • 确保你的表已经存在IsDeleted字段,如果没有,先执行SQL添加:ALTER TABLE [你的表名] ADD IsDeleted BIT DEFAULT 0
  • 所有常规查询都要过滤IsDeleted = 0,这是软删除的核心,否则用户会看到已删除的数据
  • 必须使用参数化查询,杜绝SQL注入风险
  • 用using语句管理数据库连接和命令对象,自动释放资源,避免连接池泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:34:02