C# ADO.NET 저장 프로시저 호출 및 SqlDataReader
SQL Server 저장 프로시저를 호출하고 SqlDataReader로 쿼리 결과를 스트림 방식으로 읽기 핵심 포인트:
SqlCommand.CommandType = CommandType.StoredProcedure로 저장 프로시저 실행을 지정SqlParameter를 사용해 저장 프로시저 매개변수 전달ExecuteReader(CommandBehavior.CloseConnection)로 스트림 데이터 읽기- SqlDataReader는 앞으로만 읽기 전용 스트림 판독기 이므로 사용 후 반드시 닫아야 함
저장 프로시저 정의
호출하기 전 데이터베이스에 저장 프로시저를 미리 생성해야 합니다.
create proc myProc
@id int
as
select * from [dbo].[Article] where id>@id
go
-- 호출 테스트
exec myProc @id=5Code language: JavaScript (javascript)
@id 매개변수를 받아 Article 테이블에서 id가 입력값보다 큰 데이터를 조회합니다.
C# 에서 저장 프로시저 호출
ExecuteReader 를 통해 SqlDataReader 를 얻어 여러 행 데이터를 가져올 수 있습니다.
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandText = "myProc";
sqlCom.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
param.Value = 4;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
SqlDataReader reader = sqlCom.ExecuteReader(CommandBehavior.CloseConnection);
StringBuilder sb = new StringBuilder();
while (reader.Read())
{
sb.AppendLine(reader[0] + "-" + reader[1]);
}
reader.Close();
MessageBox.Show(sb.ToString());
}Code language: C# (cs)
using 으로 Reader 해제, 리소스 누수 방지
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand sqlCom = new SqlCommand("myProc", conn))
{
sqlCom.CommandType = CommandType.StoredProcedure;//명령이 저장 프로시저임을 표시
// 입력 매개변수 추가
sqlCom.Parameters.Add("@id", SqlDbType.Int).Value = 4;
// CommandBehavior.CloseConnection: reader 종료 시 연결 자동 닫기
using (SqlDataReader reader = sqlCom.ExecuteReader(CommandBehavior.CloseConnection))
{
StringBuilder sb = new StringBuilder();
while (reader.Read())
{
// reader[0] 첫 번째 열, reader[1] 두 번째 열; reader["열이름"] 도 가능
sb.AppendLine($"{reader[0]}-{reader[1]}");
}
MessageBox.Show(sb.ToString());
}
// 수동 reader.Close() 불필요, using 이 자동으로 리소스 정리
}
}Code language: C# (cs)
CommandType 세 가지 열거형
CommandType.Text:일반 SQL 구문 실행CommandType.StoredProcedure:저장 프로시저 실행CommandType.TableDirect:테이블 직접 읽기
StoredProcedure를 설정하지 않으면 프로시저 이름을 일반 SQL 로 처리해 오류가 발생합니다!
SqlParameter 매개변수 방향
ParameterDirection.Input:입력 매개변수(값 전달, 가장 자주 사용)ParameterDirection.Output:출력 매개변수ParameterDirection.InputOutput:입출력 양방향ParameterDirection.ReturnValue:저장 프로시저 반환값
CommandBehavior.CloseConnection 의 역할
SqlDataReader 가 Close() 호출되거나 해제될 때 연결된 SqlConnection 을 자동으로 닫습니다.
사용 사례: 메서드에서 Reader 객체를 반환하고 외부에서 데이터 읽은 뒤 연결을 자동 회수할 때 적합.
SqlDataReader 주요 특징
- 앞으로만, 읽기 전용:
Read()로 아래로만 순회, 뒤로 돌아가거나 데이터 수정 불가 - 연결 점유:Reader 가 열려있는 동안 동일 연결에서 다른 작업 불가
- 리소스 반드시 해제:수동
reader.Close()또는using으로 자동 해제 권장 - 열 읽는 두 가지 방식:
csharp reader[0]; // 인덱스로 읽기 reader["Title"]; // 필드명으로 읽기(가독성 좋음)
유의점
CommandType.StoredProcedure설정 누락 → 실행 오류- 매개변수 이름 대소문자·철자가 저장 프로시저와 불일치 → 매개변수 매칭 실패
- Reader 닫지 않음 → 연결이 계속 점유되어 연결 풀 고갈
while(reader.Read())내부에서 새 DB 쿼리 실행: 하나의 연결에 여러 Reader 를 동시 사용 불가- 저장 프로시저 매개변수 누락·타입 불일치 → 실행 오류
비교
| 실행 방식 | 적용 시나리오 | 반환 객체 |
|---|---|---|
| ExecuteNonQuery | 추가·수정·삭제 저장 프로시저 | 영향받은 행 수 int |
| ExecuteScalar | 단일행 단일열 반환(집계 쿼리) | object |
| ExecuteReader | 다중행 데이터셋 반환 | SqlDataReader(스트림 읽기) |
SqlDataReader
Previous: SqlTransaction 데이터베이스 트랜잭션
Next: SqlDataAdapter