- Dapper 的更新作業使用
Execute()方法執行UPDATESQL,回傳受影響的資料列數。 - 務必加上
WHERE條件,不然會把整張資料表的全部資料更新! - 不建議:直接字串拼接SQL(圖中原始寫法),會產生SQL注入漏洞。
- 建議做法:參數化查詢,使用
@參數名,搭配實體或匿名類別自動對應參數。
原文說明:更新的實作思路和插入很像;撰寫帶有
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)
- WHERE 條件絕對不能省略
忘記寫WHERE就會變成UPDATE student SET xxx,會修改整張表全部資料,造成嚴重事故。 - 參數名稱要對齊
SQL裡的@參數名與實體、匿名類別屬性大小寫不敏感,但名稱必須完全一致。 - 回傳值代表意義
int rowsAffected:大於0代表成功更新對應筆數;等於0代表沒有找到符合條件的資料。 - 安全提醒
永遠不要直接拼接字串組裝SQL,外部輸入資料會引發SQL注入攻擊。
只更新部分欄位
如果只想修改信箱,不需要把所有欄位全部寫出來:
UPDATE student SET Email=@Email WHERE Id=@Id
更新操作
Previous: 插入
Next: Dapper 刪除操作