更新操作

  1. Dapper 的更新作業使用 Execute() 方法執行 UPDATE SQL,回傳受影響的資料列數。
  2. 務必加上 WHERE 條件,不然會把整張資料表的全部資料更新!
  3. 不建議:直接字串拼接SQL(圖中原始寫法),會產生SQL注入漏洞
  4. 建議做法:參數化查詢,使用 @參數名,搭配實體或匿名類別自動對應參數。

原文說明:更新的實作思路和插入很像;撰寫帶有UPDATE的SQL敘述,透過WHERE限制只修改目標資料列。

範例

// 危險寫法!字串拼接,容易發生SQL注入,僅做錯誤示範
using (IDbConnection db = new MySqlConnection(conn))
{
    var id = 1;
    string sqlUpdate = "UPDATE student set FirstName='新名字',LastName='新姓氏',Email='新郵件' WHERE Id=" + id;
    int rows = db.Execute(sqlUpdate);
    var info = db.Query<Student>("Select * From student WHERE Id=" + id, new { 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))
    {
        // 1.更新SQL,使用@參數佔位符
        string sqlUpdate = @"UPDATE student 
                             SET FirstName=@FirstName, LastName=@LastName, Email=@Email 
                             WHERE Id=@Id";

        // 2.準備更新資料,可以使用實體物件
        var stu = new Student()
        {
            Id = 1,
            FirstName = "foxdevelop",
            LastName = "com",
            Email = "admin@foxdevelop.com"
        };

        // 3.執行更新,取得受影響列數
        int rowsAffected = db.Execute(sqlUpdate, stu);

        // 4.查詢確認更新結果
        var studentInfo = db.Query<Student>(
            "SELECT * FROM student WHERE Id=@Id",
            new { Id = 1 }
        ).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)
  1. WHERE 條件絕對不能省略
    忘記寫WHERE就會變成UPDATE student SET xxx,會修改整張表全部資料,造成嚴重事故。
  2. 參數名稱要對齊
    SQL裡的@參數名與實體、匿名類別屬性大小寫不敏感,但名稱必須完全一致。
  3. 回傳值代表意義
    int rowsAffected:大於0代表成功更新對應筆數;等於0代表沒有找到符合條件的資料。
  4. 安全提醒
    永遠不要直接拼接字串組裝SQL,外部輸入資料會引發SQL注入攻擊。

只更新部分欄位

如果只想修改信箱,不需要把所有欄位全部寫出來:

UPDATE student SET Email=@Email WHERE Id=@Id

更新操作

發佈留言

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