- 삭제 작업 역시
db.Execute()를 사용해DELETE구문을 실행하고 영향받은 행 수를 반환합니다. - 보통 고유 기본키 ID로 대상 데이터를 찾아 삭제합니다.
WHERE조건은 반드시 넣어야 합니다! WHERE가 없으면 테이블 전체 데이터가 지워집니다.- 나쁜 예: 문자열 연결로 SQL을 만들면 SQL 인젝션 위험이 발생;✅표준 작성법: 매개변수화 쿼리.
원문 설명: 엔티티 삭제는 고유 Id로 구분하며, SQL 기본 형식은
DELETE ... WHERE 기본키=값입니다
아래 예제는 SQL 인젝션 취약점이 발생합니다
// 위험한 코드: 문자열 연결로 SQL 인젝션 위험이 존재
using (IDbConnection db = new MySqlConnection(conn))
{
var id = 1;
string sqlQuery = "DELETE FROM student WHERE Id = " + id;
int rowsAffected = db.Execute(sqlQuery);
// 삭제 결과 확인 쿼리
var info = db.Query<Student>("SELECT * FROM student WHERE Id = " + 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))
{
// 삭제 SQL, 매개변수 자리표시자 사용
string sqlDelete = "DELETE FROM student WHERE Id = @Id";
int targetId = 1;
// 삭제 실행, 익명 클래스로 매개변수 전달
int rowsAffected = db.Execute(sqlDelete, new { Id = targetId });
// 검증: 삭제 후 조회 결과는 null이어야 함
var student = db.Query<Student>(
"SELECT * FROM student WHERE Id = @Id",
new { Id = targetId }
).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)
엔티티 객체로 매개변수 전달
string sqlDelete = "DELETE FROM student WHERE Id = @Id";
var stu = new Student { Id = 1 };
int rowsAffected = db.Execute(sqlDelete, stu);Code language: C# (cs)
참고 사항
- 반환값 설명
rowsAffected > 0: 해당 행 삭제 성공;rowsAffected = 0: 조건에 맞는 데이터가 없음. - 고위험 경고
DELETE FROM student;조건 없이 실행하면 테이블 전체가 지워지므로 실수로 작성하지 마세요. - 보안 규칙
외부에서 들어온 id, 조건은 반드시@xxx매개변수를 사용하고 문자열 연결을 금지합니다.
Dapper 삭제 작업
Previous: 업데이트 작업
Next: Dapper 저장 프로시저