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參數,禁止直接拼接字串。

Dapper 刪除操作

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *