업데이트 작업

  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

업데이트 작업

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다