[C#] ExecuteNonQuery? ExecuteReader? ExecuteScalar? SQL 쿼리 실행 메서드 3종 비교. 언제, 어떤 걸 써야 할까?

데이터베이스를 다루다 보면 가장 기본적이지만 헷갈리기 쉬운 부분 중 하나가 바로 '쿼리를 어떻게 실행할 것인가'입니다.

SELECT, INSERT, UPDATE, DELETE. 익숙한 쿼리들을 사용하지만, 이를 코드 안에서 실행할 때는 목적에 맞는 메서드를 사용하는 게 유용하답니다.

ExecuteNonQuery? ExecuteReader? ExecuteScalar? 처음 볼 때에는 막연하게 Execute로 시작하는 비슷한 이름만 보고 헷갈리기 쉬울 수도 있는데요, 차이점을 간단히 알아보도록 해요. '언제 어떤 메서드를 써야 할지' 조금씩 분명해질거예요.

ExecuteNonQuery 데이터에 '변화'를 줄 때

이 메서드는 데이터를 실제로 바꾸는 쿼리에 적합합니다.

  • 사용 목적: INSERT, UPDATE, DELETE 쿼리 실행
  • 리턴 값: 영향을 받은 행(row)의 개수 (int)
  • 활용 예시:
    • 회원 정보를 수정하거나
    • 글을 삭제하거나
    • 새로운 데이터를 삽입할 때 등
int affectedRows = command.ExecuteNonQuery();

→ 결과값을 꼭 사용하지 않아도 되지만, 쿼리가 잘 실행됐는지 확인할 때 유용하게 쓸 수 있습니다.

ExecuteReader 여러 개의 데이터를 '읽고 싶을 때'

SELECT 쿼리처럼 결과값이 여러 행으로 나올 때는 ExecuteReader가 알맞습니다.

  • 사용 목적: SELECT 쿼리 실행 (때때로 UPDATE 등에도 사용 가능)
  • 리턴 값: SqlDataReader 객체
  • 활용 예시:
    • 게시판 목록 조회
    • 사용자 목록 불러오기
    • 검색 조건에 맞는 데이터 출력
using (SqlDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        Console.WriteLine(reader["USER_NAME"]);
    }
}

→ 데이터 사용이 끝난 후에는 꼭 Close() 처리를 해주셔야 해요. 연결이 유지된 상태로 남아있을 수 있거든요. 예제에서는 while을 사용하였는데, 하나의 행을 얻기 위해 if를 사용하기도 해요.

ExecuteScalar 하나의 값만 '딱' 필요할 때

이 메서드는 쿼리 결과에서 첫 번째 행의 첫 번째 열에 있는 단일 값만 가져옵니다.

  • 사용 목적: COUNT, MAX, MIN, 특정 값 추출 등
  • 리턴 값: object 타입 (필요에 따라 캐스팅)
  • 활용 예시:
    • 특정 조건의 행 개수 확인
    • 데이터 존재 여부 확인
    • 최신 등록일 등 단일 값 추출
object result = command.ExecuteScalar();
int count = Convert.ToInt32(result);

→ 결과값이 하나뿐일 때는 가장 간단하고 빠르게 사용할 수 있습니다.

🔍 상황에 따라 메서드 고르기

상황추천 메서드
데이터를 변경할 때ExecuteNonQuery()
여러 데이터를 반복적으로 조회할 때ExecuteReader()
하나의 값만 필요할 때ExecuteScalar()

💡 마무리하며

처음에는 이 세 가지 방식이 비슷하게 느껴질 수 있지만, 실제로 사용해보면 용도와 결과가 확실히 다르다는 걸 알 수 있답니다. 직접 해보는 게 쿼리 실행 메서드의 차이를 익히는 가장 좋은 방법이에요.

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗