Home Full Site
C# SqlDataAdapter 클래스

SqlDataAdapter 클래스는 SQL Server에서 데이타를 클라이언트로 가져온 후 연결을 끊고 데이타를 사용할 수 있게 하는 클래스이다. SqlDataReader는 연결을 유지하는 (Connected mode) 반면, SqlDataAdapter는 데이타를 가져온 후에 연결을 끊는다점이(Disconnected mode) 특징이다. SqlDataAdapter는 가져온 데이타를 메모리상의 데이타 객체인 DataSet에 할당한다. 이 DataSet 객체는 다시 그리드 같은 컨트롤 (예: WinForms의 DataGridView 컨트롤)에 데이타 바인딩 소스로 사용할 수 있다. 즉, DataSet 객체의 테이블 데이타를 기초로 그리드 화면에 데이타를 뿌리는 것이다. 아래 예는 SQL Table에서 데이타를 가져와 비연결 상태의 DataSet 객체를 DataGridView 컨트롤에 바인딩한 예이다.

예제

class MySample{    string strConn = "Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;";    public DataSet GetProduct()    {        DataSet ds = new DataSet();        SqlConnection conn = new SqlConnection(strConn);        conn.Open();        string sql = "SELECT ProductId,Name FROM Production.Product ORDER BY ProductId";        // SqlDataAdapter 초기화        SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);        // Fill 메서드 실행하여 결과 DataSet을 리턴받음        adapter.Fill(ds);                conn.Close();        return ds;    }}public partial class Form1 : Form{    public Form1()    {        InitializeComponent();    }    private void btnGetData_Click(object sender, EventArgs e)    {        // GetProduct 메서드 호출하여 DataSet 가져옴        MySample sample = new MySample();        DataSet dataSet = sample.GetProduct();        // DataSet을 DataGridView 컨트롤에 바인딩        dataGridView1.DataSource = dataSet.Tables[0];    }}


SqlDataAdapter 실행


SqlDataAdapter 데이타 페이징

Grid와 같은 UI 컨트롤에 데이타가 많은 경우, 사용자는 스크롤바를 이용하여 위/아래로 이동하며 데이타를 보게 된다. 하지만, 경우에 따라 이렇게 전체를 스크롤하게 하지 않고 페이지당 화면을 보고 싶은 경우가 있는데, 이때 페이징(Paging) 기능을 사용한다.

페이징을 구현하는 방식은 (1) 전체 데이타를 클라이언트에 가져와서 UI에서 페이지별로 일부씩 보여주는 방식과 (2) 서버에서 한 페이지별 데이타만 가져와서 UI에 뿌려주는 방식이 있다.

SqlDataAdapter는 전체 데이타는 물론 페이지별로 일부 데이타만 리턴하는 기능도 가지고 있다. 즉, SqlDataAdapter.Fill() 메서드에서 두번째 파라미터에 페이지 시작위치를, 세번째 파라미터에 리턴되는 레코드 최대 ROW 수를 지정하면 지정된 일부 데이타만 리턴할 수 있다. 예를 들어, adapter.Fill(ds, 10, 20, tblName)와 같이 지정하면, 전체 데이타 중 10번째 Row부터 20개의 Row를 리턴하게 된다.

아래 예제는 SqlDataAdapter를 사용하여 페이징 데이타를 활용하는 예로서, Prev 혹은 Next 버튼이 눌려질 때마다 이전 혹은 다음 페이지의 데이타를 그리드에 보여주게 된다.


예제

public partial class Form1 : Form{    const int PAGE_SIZE = 10;    int pageStartPosition = 0;    public Form1()    {        InitializeComponent();    }    private void Form1_Load(object sender, EventArgs e)    {        var ds = GetData(pageStartPosition);        dataGridView1.DataSource = ds.Tables[0];                }    private void btnPrev_Click(object sender, EventArgs e)    {        if (pageStartPosition - PAGE_SIZE < 0) return;        pageStartPosition -= PAGE_SIZE;        var ds = GetData(pageStartPosition);        dataGridView1.DataSource = ds;        dataGridView1.DataMember = "Authors";    }    private void btnNext_Click(object sender, EventArgs e)    {        pageStartPosition += PAGE_SIZE;        var ds = GetData(pageStartPosition);        dataGridView1.DataSource = ds;        dataGridView1.DataMember = "Authors";    }    private DataSet GetData(int pageStart = 0, int pageSize = PAGE_SIZE)    {        string strConn = "Data Source=.;Initial Catalog=pubs;Integrated Security=SSPI;";        SqlConnection conn = new SqlConnection(strConn);        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Authors", conn);        DataSet ds = new DataSet();        // 페이지 처음 위치(pageStart)와 페이지 크기(pageSize) 지정        adapter.Fill(ds, pageStart, pageSize, "Authors");                    return ds;    }}


SqlDataAdapter Paging


Multiple Resultset 복수 결과셋 리턴하기

일반적으로 하나의 SQL 쿼리를 보내 하나의 Resultset을 리턴하지만, 경우에 따라서는 여러 개의 SELECT 쿼리 문을 보내 여러 Resultset을 동시에 리턴받는 것이 필요할 때가 있다.

복수 Resultset을 리턴 받기 위해서는 먼저 SELECT을 세미콜론으로 분리하여 필요한 결과셋만큼 연결한다 (DB 종류에 따라 세미콜론이 필요 없기도 함). 복수 Resultset를 리턴받기 위해 SqlDataReader 혹은 SqlDataAdapter 를 사용할 수 있다. SqlDataReader을 사용할 경우 NextResult() 메서드를 사용하여 계속 다음 Resultset으로 이동할 수 있다. SqlDataAdapter가 좀 더 편리한 방식인데, 이 클래스의 Fill(dataset) 메서드를 사용하면 DataSet 객체에 각 Resultset이 순서대로 DataTables 컬렉션에 들어 간다. 즉, 첫번째 SELECT문의 결과는 dataset.DataTables[0]에, 두번째 SELECT문의 결과는 dataset.DataTables[1]에 들어가게 된다.

아래 예제는 2개의 SELECT문으로 통해 동시에 2개의 Resultset을 가져오는 샘플이다.


예제

static void Main(string[] args){                DataSet ds = new DataSet();    string strConn = "Data Source=.;Initial Catalog=pubs;Integrated Security=SSPI;";    using (var conn = new SqlConnection(strConn))    {        conn.Open();        // 복수 SELECT 문을 세미콜론으로 연결한 SQL 문        string sql = "SELECT stor_name FROM stores; SELECT pub_name FROM publishers;";        // SqlDataAdapter 초기화        SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);        // Fill 메서드 실행하여 복수 Resultset을 DataSet에 리턴받음        adapter.Fill(ds);    }    // 각 SELECT 문 당 하나의 DataTable 생성됨    DataTable dtStores = ds.Tables[0];    DataTable dtPublisher = ds.Tables[1];    Console.WriteLine(dtStores.Rows.Count);    Console.WriteLine(dtPublisher.Rows.Count);}



© csharpstudy.com