- 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 删除操作