Dapper 删除操作

  1. 删除操作同样使用 db.Execute(),执行 DELETE 语句,返回受影响行数。
  2. 删除一般依靠唯一主键ID定位目标数据。
  3. 必须添加 WHERE 条件!缺少WHERE会清空整张表。
  4. 反面案例:字符串拼接SQL,存在SQL注入风险;✅标准写法:参数化查询。

原文说明:删除实体通常依靠唯一Id标识;SQL核心为DELETE ... WHERE 主键=值

如下例子容易导致SQL注入

// 危险写法:字符串拼接,容易SQL注入
using (IDbConnection db = new MySqlConnection(conn))
{
    var id = 1;
    string sqlQuery = "DELETE FROM student WHERE Id = " + id;
    int rowsAffected = db.Execute(sqlQuery);

    // 查询验证删除结果
    var info = db.Query<Student>("SELECT * FROM student WHERE Id = " + id).SingleOrDefault();
}Code language: C# (cs)

标准参数化写法

using System.Data;
using MySql.Data.MySqlClient;
using Dapper;
using System.Configuration;

static void Main(string[] args)
{
    var conn = ConfigurationManager.ConnectionStrings["StudentConnection"].ConnectionString;
    using (IDbConnection db = new MySqlConnection(conn))
    {
        // 删除SQL,使用参数占位符
        string sqlDelete = "DELETE FROM student WHERE Id = @Id";
        int targetId = 1;

        // 执行删除,匿名类传递参数
        int rowsAffected = db.Execute(sqlDelete, new { Id = targetId });

        // 查询验证:删除后查询结果应为null
        var student = db.Query<Student>(
            "SELECT * FROM student WHERE Id = @Id",
            new { Id = targetId }
        ).SingleOrDefault();
    }
    Console.ReadKey();
}

// Student实体类
public class Student
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}Code language: C# (cs)

使用实体对象传参

string sqlDelete = "DELETE FROM student WHERE Id = @Id";
var stu = new Student { Id = 1 };
int rowsAffected = db.Execute(sqlDelete, stu);Code language: C# (cs)

说明

  1. 返回值说明
    rowsAffected > 0:成功删除对应行数;rowsAffected = 0:没有找到匹配数据。
  2. 高危提醒
    DELETE FROM student; 不带条件,直接清空整张数据表,严禁误写
  3. 安全规范
    外部传入的id、条件,一律使用参数@xxx,禁止直接拼接字符串。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注