ExecuteNonQuery

1. 메서드 설명

SqlCommand.ExecuteNonQuery()


적용 시나리오INSERT(삽입)、UPDATE(수정)、DELETE(삭제)。SELECT 쿼리에 사용하지 마세요
반환값int 타입,SQL 실행 후 영향받은 행 개수를 의미합니다

작동 원리:DML 구문 실행 시 데이터베이스에서 변경된 행 수를 반환하며, 프로그램에서 이 숫자를 확인해 작업이 정상 적용되었는지 판단합니다.

반환값 기반 업무 판단 로직

  1. INSERT:정상 삽입 성공 → 1 반환;실패 시 예외 발생;
  2. UPDATE
  • 조건에 맞는 데이터를 찾아 수정 → ≥1 반환
  • WHERE 조건에 일치하는 레코드 없음 → 0 반환(구문 자체는 오류 없이 실행되지만 수정된 데이터는 없음)
  1. 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)

참고 사항

  1. 예외가 발생하지 않았다고 업무 성공으로 판단하지 마세요
    SQL에서 오류가 없어도 데이터 변경이 이루어지지 않을 수 있습니다(조건에 맞는 행이 없어 반환값 0). 반환된 행 수를 함께 확인해야 합니다.
  2. ExecuteNonQuery는 SELECT에 사용 금지
    SELECT 실행 시 항상 -1만 반환하고 조회 결과를 얻을 수 없습니다. 데이터 조회는 ExecuteReader() / ExecuteScalar()를 사용하세요.
  3. using 구문의 장점
    using(SqlConnection conn) 블록 종료 후 데이터베이스 연결을 자동 해제하여 연결 누수를 방지합니다.
  4. 매개변수 이름은 정확히 일치해야 함
    SQL 내부의 @Title, @id는 코드 SqlParameter의 이름과 완전히 같아야 합니다. 대소문자는 구분하지 않지만 이름 자체는 틀리면 안 됩니다.

세 가지 SqlCommand 메서드 비교

메서드용도반환값
ExecuteNonQuery삽입/수정/삭제(INSERT/UPDATE/DELETE)int 영향받은 행 수
ExecuteScalar단일행 단일열 조회(COUNT, 자동증가 ID 가져오기 등)object 첫 번째 행 첫 번째 열 값
ExecuteReader다중행 다중열 SELECT 조회SqlDataReader 데이터 스트림

ExecuteNonQuery

답글 남기기

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