更新操作

  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 条件必不可少
    忘记写WHEREUPDATE student SET xxx,会修改表内全部数据,造成重大事故。
  2. 参数名称严格匹配
    SQL内@参数名 和实体/匿名类属性名称大小写不敏感,但名称必须一致。
  3. 返回值含义
    int rowsAffected:大于0代表成功更新对应条数;等于0代表没有匹配到数据。
  4. 安全提醒
    永远杜绝直接字符串拼接SQL,外部输入会引发SQL注入攻击。

只更新部分字段

如果只想修改邮箱,不用写出全部列:

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

发表回复

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