SqlDataReader

C# ADO.NET 저장 프로시저 호출 및 SqlDataReader

SQL Server 저장 프로시저를 호출하고 SqlDataReader로 쿼리 결과를 스트림 방식으로 읽기 핵심 포인트:

  1. SqlCommand.CommandType = CommandType.StoredProcedure 로 저장 프로시저 실행을 지정
  2. SqlParameter 를 사용해 저장 프로시저 매개변수 전달
  3. ExecuteReader(CommandBehavior.CloseConnection) 로 스트림 데이터 읽기
  4. 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 의 역할

SqlDataReaderClose() 호출되거나 해제될 때 연결된 SqlConnection 을 자동으로 닫습니다.
사용 사례: 메서드에서 Reader 객체를 반환하고 외부에서 데이터 읽은 뒤 연결을 자동 회수할 때 적합.

SqlDataReader 주요 특징

  1. 앞으로만, 읽기 전용Read() 로 아래로만 순회, 뒤로 돌아가거나 데이터 수정 불가
  2. 연결 점유:Reader 가 열려있는 동안 동일 연결에서 다른 작업 불가
  3. 리소스 반드시 해제:수동 reader.Close() 또는 using 으로 자동 해제 권장
  4. 열 읽는 두 가지 방식:
    csharp reader[0]; // 인덱스로 읽기 reader["Title"]; // 필드명으로 읽기(가독성 좋음)

유의점

  1. CommandType.StoredProcedure 설정 누락 → 실행 오류
  2. 매개변수 이름 대소문자·철자가 저장 프로시저와 불일치 → 매개변수 매칭 실패
  3. Reader 닫지 않음 → 연결이 계속 점유되어 연결 풀 고갈
  4. while(reader.Read()) 내부에서 새 DB 쿼리 실행: 하나의 연결에 여러 Reader 를 동시 사용 불가
  5. 저장 프로시저 매개변수 누락·타입 불일치 → 실행 오류

비교

실행 방식적용 시나리오반환 객체
ExecuteNonQuery추가·수정·삭제 저장 프로시저영향받은 행 수 int
ExecuteScalar단일행 단일열 반환(집계 쿼리)object
ExecuteReader다중행 데이터셋 반환SqlDataReader(스트림 읽기)

SqlDataReader

답글 남기기

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