login register Sysop! about ME  
qrcode
    최초 작성일 :    2002년 03월 20일
  최종 수정일 :    2002년 03월 20일
  작성자 :    깜찍이 (박수인)
  편집자 :    Taeyo (김 태영)
  읽음수 :    25,728

강좌 목록으로 돌아가기

필자의 잡담~

..

안녕하세요.
어느덧 봄이 온 것 같네요.
빨리 빨리 강좌를 올려서 간단한 강좌를 끝내야 겠다고 생각은 많이 하고 있는데 그게 쉽지가 않네요.
오늘까지 이렇게 데이터를 불러오는 것으로 .NET Data Provider에 대해서는 간단하게 마치고, 다음 강좌부터는 DataSet에 대해서 알아보는 것으로 하겠습니다.
그럼 시작하겠습니다.

시작 전에 잠시 잡담...
제 책이 이번 주 안에 나오겠네요...
강좌에서보다 더 자세한 내용이 있는 제 책, 많은 성원 바랍니당~~~ ^^;;

DataReader 클래스는 간략하게 말하면 데이터베이스에 연결된 상태에서 읽기 전용( read-only ), 전진 전용( forward-only )의 레코드셋으로 불러오는 클래스입니다. 그렇기 때문에 데이터를 불러오는 기능을 하는 클래스 중에 가장 성능이 좋은 것입니다. 다음은 DataReader의 특징입니다.

• DataReader 객체의 레코드셋은 읽기 전용입니다.
• DataReader 객체의 레코드셋은 전진 전용입니다. 따라서 페이징을 사용하거나
   처음의 레코드로 가는 등의 다양한 기능은 가지고 있지 않습니다.
• DataReader가 열려있는 동안은 Connection 객체를 이용해서 다른 일을 할 수 없습니다.
   이는 DataReader가 연결 지향적인 레코드셋이기 때문입니다.

DataReader를 이용해서 단순하게 레코드셋을 가져올 수 있을 뿐 아니라, 여러 개의 레코드셋을 가져올 수도 있습니다. 또한 저장 프로시저를 사용해서 레코드셋을 가져올 수도 있습니다. 이번 강좌에서는 가장 많이 사용되는 Command 객체의 ExecuteReader()를 이용한 예제를 다루도록 하겠습니다.
다음은 DataReader를 이용해서 레코드셋을 가져오는 순서입니다.

ⓐ Connection 객체를 생성합니다.
ⓑ Command 객체를 생성합니다.
ⓒ Command 객체의 CommandText 프로퍼티에 쿼리문이나 저장 프로시저를 설정합니다.
ⓓ Command 객체의 CommandType 프로퍼티에 실행될 쿼리문의 종류를 설정합니다.
ⓔ Command 객체의 Connection 프로퍼티에 Connection 객체를 설정해줍니다.
ⓕ Connection 객체의 Open() 메서드를 호출하여 데이터베이스를 열어줍니다.
ⓖ Command 객체의 ExecuteReader() 메서드를 호출하여 해당 쿼리문이나 저장 프로시저를 실행해서
    DataReader 객체에 레코드셋을 넣습니다.
ⓗ DataReader의 Read() 메서드를 호출해서 각각의 레코드에 대한 처리를 합니다.
ⓘ 해당 처리가 끝났으면 DataReader의 Close() 메서드를 호출하여 DataReader 객체를 닫아줍니다.
ⓙ Connection 객체의 Close() 메서드를 호출하여 데이터베이스를 닫아줍니다.

이번에도 역시 쿼리문을 직접 입력해서 데이터를 불러오는 방법과 sp를 이용해서 데이터를 불러오는 방법을 모두 이용해 보도록 하겠습니다.
다음은 데이터를 불러오는 sp입니다.

Create Proc up_SelectAllAddress
As
Begin
    Select    *
    From    Address
End

물론 더 복잡한 sp를 사용할 수도 있지만 간단하게 사용하기 위해서 위와 같은 sp를 작성했습니다.
위의 sp는 잠시 후에 다루도록 하고 먼저 직접 쿼리문을 입력해서 만들어보도록 하겠습니다. 새로운 프로젝트를 만들고 프로젝트의 이름을 DataReaderEx로 합니다. 새 프로젝트 대화상자는 앞의 강좌에서 몇 번 보여드렸으니까 이제부터는 그림으로 보여드리지는 않겠습니다.
새 프로젝트가 생성이 되면 코드 편집기에 다음의 코드를 입력합니다.

using System;
using System;
using System.Data;
using System.Data.SqlClient;

namespace DataReaderEx
{
    public class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Connection 객체를 생성합니다.
            SqlConnection connection = new SqlConnection( "server=localhost;"
                + "database=Study;uid=sa;pwd=tndls" );

            GetRecordByTSql( connection );
        }// Main 메서드 끝

        static void GetRecordByTSql( SqlConnection connection )
        {
            // Command 객체를 생성합니다.
            SqlCommand command = new SqlCommand( "Select * From Address", connection );

            // Command 객체의 CommandType 프로퍼티에 실행될 쿼리문의 종류를 설정합니다.
            command.CommandType = CommandType.Text;

            // Connection 객체의 Open() 메서드를 호출하여 데이터베이스를 열어줍니다.
            connection.Open();

            // Command 객체의 ExecuteReader() 메서드를 호출하여 해당 쿼리문이나
            // 저장 프로시저를 실행해서 DataReader 객체에 레코드셋을 넣습니다.
            SqlDataReader reader = command.ExecuteReader();

            // DataReader의 Read() 메서드를 호출해서 각각의 레코드에 대한 처리를 합니다.
            while ( reader.Read() )
            {
                Console.WriteLine( "{0}\t{1}\t{2}", reader["ID"], reader["Name"]
                    , reader["Email"] );
            }

            // 해당 처리가 끝났으면 DataReader의 Close() 메서드를 호출하여
            // DataReader 객체를 닫아줍니다.
            reader.Close();

            // Connection 객체의 Close() 메서드를 호출하여 데이터베이스를 닫아줍니다.
            connection.Close();
        }    // GetRecordByTSql 메서드 끝
    }    // 클래스 끝
}

어떤가요? 기존의 RecordSet과는 다소 차이가 조금 있죠?
그래도 걱정하지 마세요. 그 넘이 그 넘이랍니다. ^^
일단 주의 깊게 보실 부분은 다음의 두 가지 정도 밖에 없을 것 같네요...

// Command 객체의 ExecuteReader() 메서드를 호출하여 해당 쿼리문이나
// 저장 프로시저를 실행해서 DataReader 객체에 레코드셋을 넣습니다.
SqlDataReader reader = command.ExecuteReader();

위의 소스에서 보면 Command 객체의 ExecuteReader() 메서드를 이용해서 DataReader 객체에 레코드를 넣어주는 것을 알 수 있죠? 기존의 RecordSet은 Open() 으로 레코드를 가져오는 것과는 약간 다른 방식을 보이고 있네요.

// DataReader의 Read() 메서드를 호출해서 각각의 레코드에 대한 처리를 합니다.
while ( reader.Read() )
{
    Console.WriteLine( "{0}\t{1}\t{2}", reader["ID"], reader["Name"]
        , reader["Email"] );
}

이 소스 역시 좀 다르죠? RecordSet은 EOF 또는 BOF를 확인하고 레코드가 있을 때에만 루프를 돌 수 있도록 구현해야 했는데, DataReader 객체의 Read() 메서드를 호출함으로써 그 노동을 줄일 수 있게 됬습니다.
Read() 메서드는 레코드가 있을 경우에는 true를 리턴하고 없을 경우에는 false를 리턴해서 개뱔자가 그 리턴값으로 구현할 수 있게 되었습니다.
많이 좋아졌죠?

// 해당 처리가 끝났으면 DataReader의 Close() 메서드를 호출하여
// DataReader 객체를 닫아줍니다.
reader.Close();

역시 리소스를 사용했으면 리소스를 반환하는 부분입니다.
이제 빌드를 하시고 ( Ctrl + Shift + B ) 실행을 해 보세요. ( Ctrl + F5 )

자, 위와 같이 결과 화면이 나오나요?
너무 간단하죠?
여러분 중에는 "왜 자꾸 콘솔만 하는거야?" 라고 불평하시는 분이 계실지 모르겠네요.
하지만 이렇게 콘솔을 하고 나면 나중에 윈도우나 웹 응용 프로그램을 작성하기가 훨씬 쉬워질 것이라는 것을 알게 될 거예요.
이번에는 sp를 이용해서 레코드를 가져오도록 하겠습니다.
위의 소스를 약간 수정하도록 하겠습니다.
소스에서 다음의 메서드를 하나 추가합니다. 메서드의 이름은 GetRecordBySP 입니다.

static void GetRecordBySP( SqlConnection connection )
{
    // Command 객체를 생성합니다.
    SqlCommand command = new SqlCommand( "up_SelectAllAddress", connection );

    // Command 객체의 CommandType 프로퍼티에 실행될 쿼리문의 종류를 설정합니다.
    command.CommandType = CommandType.StoredProcedure;

    // Connection 객체의 Open() 메서드를 호출하여 데이터베이스를 열어줍니다.
    connection.Open();

    // Command 객체의 ExecuteReader() 메서드를 호출하여 해당 쿼리문이나
    // 저장 프로시저를 실행해서 DataReader 객체에 레코드셋을 넣습니다.
    SqlDataReader reader = command.ExecuteReader();

    Console.WriteLine( "==== SP를 이용해서 가져온 레코드 ====" );

    // DataReader의 Read() 메서드를 호출해서 각각의 레코드에 대한 처리를 합니다.
    while ( reader.Read() )
    {
        Console.WriteLine( "{0}\t{1}\t{2}", reader["ID"], reader["Name"]
            , reader["Email"] );
    }

    // 해당 처리가 끝났으면 DataReader의 Close() 메서드를 호출하여
    // DataReader 객체를 닫아줍니다.
    reader.Close();

    // Connection 객체의 Close() 메서드를 호출하여 데이터베이스를 닫아줍니다.
    connection.Close();
}

위에서 볼드체로 처리한 두 부분만 조금 다릅니다.
쿼리문을 설정하는 방법인데 위와 같이 sp 를 사용할 때에는 반드시 Command 객체의 CommandType을 StoredProcedure라고 명시를 해 주어야 합니다. 그렇지 않은 경우에는 일반 쿼리문으로 인식해서 에러가 발생하거든요...
위에서 작성한 메서드를 Main 메서드에서 호출하는 코드를 추가하고 프로그램을 실행하면 다음과 같은 결과를 볼 수 있습니다.

이번 강좌에 사용한 소스 파일은 제 홈페이지의 공개 소스 자료실에서 다운을 받으실 수 있습니다.
간단하지만 DataReader 클래스를 사용하는 방법에 대해서 알아보았습니다. 다음에는 DataSet에 대한 간단한 내용을 준비해보겠습니다.
여러분들 모두 좋은 하루 되시구요...
그럼 이만...

Written By 깜찍이
HomePage : http://www.cuteguy.pe.kr


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})