데이터베이스를 다루다 보면 가장 기본적이지만 헷갈리기 쉬운 부분 중 하나가 바로 '쿼리를 어떻게 실행할 것인가'입니다.
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() |
💡 마무리하며
처음에는 이 세 가지 방식이 비슷하게 느껴질 수 있지만, 실제로 사용해보면 용도와 결과가 확실히 다르다는 걸 알 수 있답니다. 직접 해보는 게 쿼리 실행 메서드의 차이를 익히는 가장 좋은 방법이에요.
