[카테고리:] <span>MSSQL과 ADO.NET</span>

SqlDataAdapter는 SQL 데이터 소스와 DataSet 간의 연결에 사용합니다. Fill 메서드를 이용하여 데이터 소스의 데이터를 얻어와 DataSet을 채우고 Update 메서드를 이용하여 DataSet의 데이터로 데이터 소스의 데이터를 일치시키게 합니다.

SqlDataDataper에 검색, 추가, 변경, 삭제에 사용할 SqlCommand를 초기에 설정한 후에 데이터 소스의 데이터를 Fill 메서드를 이용해 DataSet을 채우고 이 후에 작업은 DataSet으로 데이터를 관리하다가 데이터 소스를 변경할 필요가 있을 때 Update 메서드를 이용하여 데이터 소스에 반영시키는 것이 일반적인 사용입니다.

▷클래스 상속 계층

System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Data.Common.DataAdapter
System.Data.Common.DbDataAdapter
System.Data.SqlClient.SqlDataAdapter

다음은 SqlDataAdapter 클래스에서 제공하는 생성자입니다.

public SqlDataAdapter ( );
public SqlDataAdapter ( SqlCommand sel_command);
public SqlDataAdapter ( string sel_text, SqlConnection con);
public SqlDataAdapter ( string sel_text, string con_str);

SqlDataAdapter 개체는 Fill 메서드를 이용하여 SelectCommand로 탐색 결과를 DataSet 개체의 데이터를 채워줍니다. 이는 데이터 소스인 SQL 서버의 테이블의 데이터로부터 메모리 상의 DataSet 개체의 테이블 데이터를 채워주는 역할을 합니다.

adapter.SelectCommand = new SqlCommand(select * from Books, con);
adapter.Fill(ds,"Books");

다음은 SqlDataAdapter 개체를 생성하여 Books 테이블과 Publishers 테이블의 내용을 DataSet 개체에 반영하는 예제 코드입니다.

static void Main(string[] args)
{
    string constr = @"Data Source=[서버 이름];Initial Catalog=[DB 명]; User ID=[ID];Password=[PW]";
    string comtxt_book = "select * from Books;";
    string comtxt_pub = "select * from Publishers";
    DataSet ds = new DataSet("Library");
    using (SqlConnection con = new SqlConnection(constr))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(comtxt_book, con);
        adapter.Fill(ds,"Books");
        adapter.SelectCommand = new SqlCommand(comtxt_pub,con);
        adapter.Fill(ds, "Publishers");
        ViewDataSet(ds);
    }
}
private static void ViewDataSet(DataSet ds)
{
    Console.WriteLine("DataSet 명:{0}", ds.DataSetName);
    Console.WriteLine("Table 수:{0}",ds.Tables.Count);
    foreach (DataTable dt in ds.Tables)
    {
        ViewDataTable(dt);
    }
}
private static void ViewDataTable(DataTable dt)
{
   Console.WriteLine("Table 명:{0}", dt.TableName);
    foreach (DataRow dr in dt.Rows)
    {
        foreach (DataColumn dc in dt.Columns)
        {
            Console.Write("{0} ",dr[dc.ColumnName]);
        }
        Console.WriteLine();
    }
}

실행 결과

DataSet 명:Library
Table 수:2
Table 명:Books
ADO.NET 12000 홍길동 123-456-789 1
XML.NET 15000 강감찬 456-111-111 2
Table 명:Publishers
언제나휴일 1
언제나평일 2

프로그램 상의 DataSet의 내용을 데이터 소스인 SQL 서버에 반영할 때는 Update 메서드를 사용합니다.

public int Update(DataRow[] rows );
public int Update(DataSet ds );
public int Update(DataTable dt );
public int Update(DataSet ds, string table_name );

Update 메서드를 사용하려면 SqlDataAdapter개체의 InsertCommand, DeleteCommand, UpdateCommand 속성에 적절한 SqlCommand 개체를 설정해야 합니다.

string cmd_text = "update Books set Price=@Price where (ISBN = @ISBN)";
SqlCommand cmd = new SqlCommand(cmd_text, con);            
cmd.Parameters.Add("@Price", SqlDbType.Int,4,"Price");
cmd.Parameters.Add("@ISBN", SqlDbType.VarChar,50,"ISBN");


DataTable dt_books = ds.Tables["Books"];
foreach (DataRow dr in dt_books.Rows)
{
    dr["Price"] = 0;
}
adapter.UpdateCommand = cmd;
adapter.Update(ds, "Books");

다음은 SqlDataAdapter 개체를 생성하여 Books 테이블과 Publishers 테이블의 내용을 DataSet 개체에 반영한 후에 Books 테이블의 모든 책의 가격 정보를 0으로 변경하고 이를 다시 SQL 서버의 Books 테이블에 반영하는 예제 코드입니다.

class Program
{
    static void Main(string[] args)
    {
        string constr = @"Data Source=[서버 이름];Initial Catalog=[DB 명]; User ID=[ID];Password=[PW]";
        string comtxt_book = "select * from Books;";
        string comtxt_pub = "select * from Publishers";
 
        DataSet ds = new DataSet("Library");
        using (SqlConnection con = new SqlConnection(constr))
        {                               
            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = new SqlCommand(comtxt_book, con);                                
            adapter.Fill(ds,"Books");
            adapter.SelectCommand = new SqlCommand(comtxt_pub,con);
            adapter.Fill(ds, "Publishers"); 
            ViewDataSet(ds);
            DataTable dt_books = ds.Tables["Books"];
            foreach (DataRow dr in dt_books.Rows)
            {
                dr["Price"] = 0;
            }
            adapter.UpdateCommand = MakeUpdateCommand(con);
            adapter.Update(ds, "Books");
            Console.WriteLine("----------------");
            ViewDataSet(ds);
        }
    }

    private static SqlCommand MakeUpdateCommand(SqlConnection con)
    {
        string cmd_text = "update Books set Price=@Price where (ISBN = @ISBN)";
        SqlCommand cmd = new SqlCommand(cmd_text, con);            
        cmd.Parameters.Add("@Price", SqlDbType.Int,4,"Price");
        cmd.Parameters.Add("@ISBN", SqlDbType.VarChar,50,"ISBN");
        return cmd;
    }
    private static void ViewDataSet(DataSet ds)
    {
        Console.WriteLine("DataSet 명:{0}", ds.DataSetName);
        Console.WriteLine("Table 수:{0}",ds.Tables.Count);
        foreach (DataTable dt in ds.Tables){    ViewDataTable(dt);        }
    }
    private static void ViewDataTable(DataTable dt)
    {
        Console.WriteLine("Table 명:{0}", dt.TableName);
        foreach (DataRow dr in dt.Rows)
        {
            foreach (DataColumn dc in dt.Columns)
            {
                Console.Write("{0} ",dr[dc.ColumnName]);
            }
            Console.WriteLine();
        }
    }
}

실행 결과

DataSet 명:Library
Table 수:2
Table 명:Books
ADO.NET 12000 홍길동 123-456-789 1
XML.NET 15000 강감찬 456-111-111 2
Table 명:Publishers
언제나휴일 1
언제나평일 2
-----------------
DataSet 명:Library
Table 수:2
Table 명:Books
ADO.NET 0 홍길동 123-456-789 1
XML.NET 0 강감찬 456-111-111 2
Table 명:Publishers
언제나휴일 1
언제나평일 2

이상으로 ADO.NET 기술 소개를 마칠게요. 여러분께서는 보다 깊은 학습과 사용으로 숙련하세요.

MSSQL과 ADO.NET