1. 메서드 설명
SqlCommand.ExecuteNonQuery()
적용 시나리오:INSERT(삽입)、UPDATE(수정)、DELETE(삭제)。SELECT 쿼리에 사용하지 마세요
반환값:int 타입,SQL 실행 후 영향받은 행 개수를 의미합니다
작동 원리:DML 구문 실행 시 데이터베이스에서 변경된 행 수를 반환하며, 프로그램에서 이 숫자를 확인해 작업이 정상 적용되었는지 판단합니다.
반환값 기반 업무 판단 로직
- INSERT:정상 삽입 성공 →
1반환;실패 시 예외 발생; - UPDATE:
- 조건에 맞는 데이터를 찾아 수정 → ≥1 반환
WHERE조건에 일치하는 레코드 없음 →0반환(구문 자체는 오류 없이 실행되지만 수정된 데이터는 없음)
- DELETE:
- 일치하는 데이터 삭제 → ≥1 반환
- 일치하는 데이터 없음 →
0반환
중요 구분:반환값 0 ≠ 프로그램 오류。SQL 문법은 정상 실행되었을 뿐 조건에 맞는 데이터가 없어 변경이 일어나지 않은 상태입니다.
INSERT 삽입 예제
private void button2_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=True";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
// SQL 인젝션 방지용 매개변수화 SQL
sqlCom.CommandText = "INSERT INTO [dbo].[Article]([Title]) VALUES(@Title)";
sqlCom.CommandTimeout = 60;
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "새 제목" + DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());
// 삽입 성공 시 res=1
}
}Code language: JavaScript (javascript)
장점:매개변수화 쿼리,문자열 연결로 인한 SQL 인젝션 취약점을 막아줍니다.
UPDATE 수정 예제
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandText = "UPDATE [dbo].[Article] SET [Title] = @Title WHERE id = @id";
sqlCom.CommandTimeout = 60;
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "새 제목"+DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
// 두 가지 매개변수 추가 문법, 동일한 동작
//방식1: 객체 생성 뒤 추가
SqlParameter param2 = new SqlParameter("@id", SqlDbType.Int);
param2.Value = 5;
sqlCom.Parameters.Add(param2);
//방식2: 체이닝으로 직접 추가(주석 처리된 코드)
//sqlCom.Parameters.Add(new SqlParameter("@id", SqlDbType.Int){Value=5});
int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());Code language: JavaScript (javascript)
- 테이블에
id=5데이터 존재 →res=1 id=5데이터 없음 →res=0
실제 업무 판단 예시:
if(res > 0)
{
MessageBox.Show("수정 성공");
}
else
{
MessageBox.Show("대상 데이터를 찾지 못했습니다. 수정이 실행되지 않았습니다");
}Code language: JavaScript (javascript)
참고 사항
- 예외가 발생하지 않았다고 업무 성공으로 판단하지 마세요
SQL에서 오류가 없어도 데이터 변경이 이루어지지 않을 수 있습니다(조건에 맞는 행이 없어 반환값 0). 반환된 행 수를 함께 확인해야 합니다. ExecuteNonQuery는 SELECT에 사용 금지
SELECT 실행 시 항상-1만 반환하고 조회 결과를 얻을 수 없습니다. 데이터 조회는ExecuteReader()/ExecuteScalar()를 사용하세요.- using 구문의 장점
using(SqlConnection conn)블록 종료 후 데이터베이스 연결을 자동 해제하여 연결 누수를 방지합니다. - 매개변수 이름은 정확히 일치해야 함
SQL 내부의@Title,@id는 코드SqlParameter의 이름과 완전히 같아야 합니다. 대소문자는 구분하지 않지만 이름 자체는 틀리면 안 됩니다.
세 가지 SqlCommand 메서드 비교
| 메서드 | 용도 | 반환값 |
|---|---|---|
| ExecuteNonQuery | 삽입/수정/삭제(INSERT/UPDATE/DELETE) | int 영향받은 행 수 |
| ExecuteScalar | 단일행 단일열 조회(COUNT, 자동증가 ID 가져오기 등) | object 첫 번째 행 첫 번째 열 값 |
| ExecuteReader | 다중행 다중열 SELECT 조회 | SqlDataReader 데이터 스트림 |
ExecuteNonQuery
Previous: 실행 최적화 및 매개변수 전달