4. dataset 과 dataadapter. 2.net 데이터 공급자 4.1 dataset 과 dataadapter 의 관계...

37
4. DataSet 과 DataAdapter

Upload: kristopher-neal

Post on 02-Jan-2016

260 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

4. DataSet 과 DataAdapter

Page 2: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

2

.NET 데이터 공급자

4.1 DataSet 과 DataAdapter 의 관계

Connection

Command

DataReader

Transaction

Transaction

DataAdapter

SelectCommand

InsertCommand

UpdateCommand

DeleteCommand

DataSet

DataTableCollection

DataTable

DataRowCollection

DataColumnCollection

ConstraintCollection

DataRelationCollection

Database XML

Page 3: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

3

DataAdapterConnection

Database

CommandDataReader

DataSet

연결지향

비연결지향

.Net 에서 이용되는 데이터 구조

Page 4: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

4

4.2 DataAdapter 속성과 함수

▣ DataAdapter 속성◈ DeleteCommand

– 삭제 명령을 사용하는 Command 필드◈ InsertCommand

– 입력 명령을 사용하는 Command 필드◈ SelectCommand

– 조회 명령을 사용하는 Command 필드◈ UpdateCommand

– 수정 명령을 사용하는 Command 필드

▣ DataAdapter 주요 함수◈ Fill()

– 데이터 원본에 있는 데이터를 DataSet 의 DataTable 에 넣어준다 .◈ FillSchema()

– 데이터 원본의 스키마에 맞게 DataSet 에 DataTable 을 생성한다 .◈ Update()

– DataSet 의 DataTable 에서 변경된 데이터를 원본에 반영시킨다 .

DataAdapter

SelectCommand

InsertCommand

UpdateCommand

DeleteCommand

DataSet

Fill()

FillSchema()

update()

Page 5: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

5

4.3 DataSet 의 구성요소

.Net DataSet 구성요소

ConstraintConstraint

DataColumnDataColumn

DataRowDataRow

DataTable

DataRelationDataRelation

DataTable

ConstraintConstraint

DataColumnDataColumn

DataRowDataRow

DataRelationDataRelation

DataTable

ConstraintConstraint

DataColumnDataColumn

DataRowDataRow

DataRelationDataRelation

DataTable

ConstraintConstraint

DataColumnDataColumn

DataRowDataRow

DataRelationDataRelation

DataColumn

DataRow

DataColumn DataColumn

DataRow

DataRow

DataSet 의 개념상의 구성요소

DataSet

DataTable

DataColumnCollectionDataColumnCollectionDataRowCollection

DataColumnCollectionDataColumnCollectionDataTableCollection

DataTable

DataTable

DataTable

DataColumnCollectionDataColumnCollectionDataColumnCollection

Page 6: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

6

DataSet 의 계층구조DataSet

DataTable

DataColumnCollection

DataRowDataColumn

DataColumnCollectionDataColumnCollection DataColumnCollectionDataColumnCollectionDataRowCollection

DataColumnCollectionDataColumnCollectionDataTableCollection

Page 7: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

7

4.4 DataSet 을 만드는 방법 I

1. Connection 생성 및 Open◈ string conStr = "Server=localhost;user id=sa;password=;database=northwind";◈ SqlConnection conn = new SqlConnection(conStr);◈ conn.Open();

2. DataAdapter 생성◈ SqlDataAdapter adapter = new SqlDataAdapter();

3. SqlCommand 할당◈ string query = "select * from Address";◈ adapter.SelectCommand = new SqlCommand(query, conn);

4. DataSet 생성◈ DataSet ds = new DataSet();

5. DataAdapter 를 이용해서 DataSet 채우기◈ adapter.Fill(ds);

6. 작업수행

7. 연결 닫기◈ conn.Close();

Page 8: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

8

4.5 DataSet 으로 작업하기▣ Connenction 생성과 Open

◈ string conStr = "Server=localhost;user id=sa;password=;database=northwind";◈ SqlConnection conn = new SqlConnection(conStr);◈ conn.Open();

▣ SqlDataAdapter 생성◈ SqlDataAdapter adapter = new SqlDataAdapter();

▣ Adapter 에 SelectCommand 할당◈ string query = "select * from Address";

▣ adapter.SelectCommand = new SqlCommand(query, conn);▣ DataSet 생성

◈ DataSet ds = new DataSet();▣ Adapter 를 통해서 DataSet 채우기

◈ adapter.Fill(ds);▣ Connection 닫기

◈ conn.Close();

▣ DataSet 으로 작업하기◈ DataTable table= ds.Tables[0];◈ DataRowCollection rows = table.Rows;◈ foreach (DataRow dr in rows){◈ for (int i = 0; i<table.Columns.Count; i++)◈ Console.Write("{0,15}",dr[i]);◈ Console.WriteLine();◈ }

DataSet 의 계층구조

DataSet

DataColumnCollection

DataRowDataColumn

DataColumnCollectionDataColumnCollection DataColumnCollectionDataColumnCollectionDataRowCollection

DataColumnCollectionDataColumnCollectionDataTableCollectionTables

ColumnsRows

DataTable

Page 9: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

9

4.6 DataSet 을 만드는 방법 II

▣ Connection 생성 및 Open◈ string conStr = "Server=localhost;user id=sa;password=;database=northwind";◈ SqlConnection conn = new SqlConnection(conStr);◈ conn.Open();

▣ DataSet 만들기◈ SqlDataAdapter adapter = new SqlDataAdapter("select * from Address", conn);◈ DataSet ds = new DataSet("MyAddressDataSet");//DataSet 의 이름◈ adapter.Fill(ds);// 테이블의 이름◈ conn.Close();

▣ DataSet 으로 작업하기◈ DataTable table = ds.Tables[0];◈ DataRowCollection rows = table.Rows;◈ foreach (DataRow dr in rows){◈ for (int i = 0; i<table.Columns.Count; i++)◈ Console.Write("{0,15}",dr[i]);◈ Console.WriteLine();◈ }

SqlDataAdapter adapter = new SqlDataAdapter();

string query = "select * from Address";

adapter.SelectCommand = new SqlCommand(query, conn);

DataSet ds = new DataSet();

Page 10: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

10

4.7 DataSet 의 Update()

▣ DataSet 에서 InsertCommand 명령을 수행하는 방법◈ DataSet 자체에 레코드를 삽입한다 .◈ DataAdapter 에 SqlCommand 를 지정한다 .◈ DataAdapter 를 이용해서 DataSet 을 데이터베이스로 업데이트한다 .

DataSet 의 InsertCommand 명령 수행

DataSet

DataTable

DataColumnCollectionDataColumnCollectionDataTableCollectionDataRow

Database

DataAdapter 에 SqlCommand 지정

(Insert 문장 ) 새로운 Row 삽입

12

3DataAdpater 를 이용해서 Update()

DataRow row = table.NewRow();row["id"] = "8";row["name"] = "Uncle";row["addr"] = "Ameria";table.Rows.Add(row);

Page 11: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

11

▣ SqlDataAdapter adapter = new SqlDataAdapter("select * from Address", conn);▣ DataSet ds = new DataSet("MyAddressDataSet");//DataSet 의 이름▣ adapter.Fill(ds, "Address");// 테이블의 이름▣ conn.Close();▣ DataTable table = ds.Tables["Address"];

▣ //1. DataRow 생성하여 Row 를 삽입하기▣ DataRow row = table.NewRow();▣ row["id"] = "8";▣ row["name"] = "Uncle";▣ row["addr"] = "Ameria";▣ table.Rows.Add(row);

▣ //2. SqlCommand 지정하기▣ conn.Open();▣ string strSql="Insert into Address(id, name, addr)values(@id, @name, @addr)";▣ adapter.InsertCommand = new SqlCommand(strSql, conn);▣ adapter.InsertCommand.Parameters.Add("@id", SqlDbType.TinyInt, 0, "id");▣ adapter.InsertCommand.Parameters.Add("@name", SqlDbType.Char, 20, "name");▣ adapter.InsertCommand.Parameters.Add("@addr", SqlDbType.Char, 40, "addr");

▣ //3. DataAdapter 를 이용하여 DataSet 업데이트하기▣ adapter.Update(ds, "Address");▣ conn.Close();

Page 12: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

12

4.8 DataSet 병합하기

▣ DataSet 병합하기◈ 두개의 DataSet 을 결합해서 하나의 DataSet 으로 만든다 .

▣ DataSet 병합과정◈ 두개의 DataSet 에 데이터가 들어있다고 가정

– DataSet ds1 = new DataSet();– DataSet ds2 = new DataSet();

◈ 두개의 DataSet 을 병합하기 위해서는 Merge() 함수 사용– ds1.Merge(ds2);– ds1 은 ds2 와 병합된 데이터가 들어있다 .

◈ ds1 의 복사본 만들기– DataSet dsc = ds1.Copy();

Page 13: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

13

4.9 DataSet 의 관계 설정▣ DataTable 생성

◈ DataTable publicTable = new DataTable("publics");◈ publicTable.Columns.Add(new DataColumn("publicID", typeof(int)));◈ publicTable.Columns.Add(new DataColumn("Name", typeof(string)));◈ publicTable.Constraints.Add( new UniqueConstraint("PK_Publics", publicTable.Columns[0]));◈ publicTable.PrimaryKey = new DataColumn[ ]{publicTable.Columns[0]} ;

◈ DataTable bookTable = new DataTable("Book");◈ bookTable.Columns.Add(new DataColumn("BookID", typeof( int))) ;◈ bookTable.Columns.Add(new DataColumn("Name", typeof( string))) ;◈ bookTable.Columns.Add(new DataColumn("publicID", typeof ( int))) ;◈ bookTable.Constraints.Add(new UniqueConstraint("PK_Book", bookTable.Columns[0])) ;◈ bookTable.PrimaryKey = new DataColumn[ ] { bookTable.Columns[0] } ;

▣ DataSet 에 DataTable 삽입◈ DataSet ds = new DataSet("publication");◈ ds.Tables.Add (publicTable) ;◈ ds.Tables.Add (bookTable) ;

▣ Relation 설정◈ ds.Relations.Add ("Books", ds.Tables["publics"].Columns["publicID"],◈ ds.Tables["Book"].Columns["publicID"]) ;

Page 14: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

14

▣ 형식화된 DataSet 으로 작업하기 ◈ Solution Explorer 의 프로젝트에서 마우스 오른쪽 버튼 클릭 후

[Add]-[New Item]

4.13 DataSet 의 추가 자료

Page 15: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

15

◈ 템플릿 목록 중 데이터 집합을 선택 ◈ 이름을 “ Customer.xsd” 로 변경

Page 16: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

16

◈ Server Explorer 에서 해당 테이블로 이동◈ Customer, Orders 테이블을 Customer.xsd 로 드롭◈ Customer 테이블에서 CustomerID 필드를 드래그하여 Orders

테이블의 CustomerID 로 드롭

Page 17: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

17

◈ 관계 편집 대화 상자가 표시되면 이름을 CustOrders 로 변경

Page 18: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

18

◈ Form2 에서 DataSet 컨트롤을 드롭◈ 데이터 집합 추가 대화 상자에서 Typed dataset 을 선택

Page 19: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

19

◈ DataGridview 의 DataSource 속성을 Customer.Customer 로 지정

Page 20: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

20

◈ Form2 의 소스 수정– myDataSet 변수의 선언부분 변경

public class Form2 : System.Windows.Forms.Form

{

SqlConnection mySqlConnection;

//DataSet myDataSet;

Customer myDataSet;

...

Page 21: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

21

◈ Form2 의 소스 수정– btnGet_Click 메서드에 추가– 이전 DataSet 데이터 형식을 사용한 부분을 주석처리

private void btnGet_Click(object sender, System.EventArgs e)

{

mySqlDataAdapter1 = new SqlDataAdapter("select * from customers", mySqlConnection);

mySqlDataAdapter2 = new SqlDataAdapter("select * from orders", mySqlConnection);

try

{

//myDataSet = new DataSet();

myDataSet = new Customer();

mySqlDataAdapter1.Fill(myDataSet,"Customers");

mySqlDataAdapter2.Fill(myDataSet,"Orders");

// ADD RELATION

//myDataSet.Relations.Add("CustOrders",myDataSet.Tables["Customers"].Columns["CustomerId"],myDataSet.Tables["Orders"].Columns["CustomerId"]);

Page 22: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

22

//dataGrid1.DataSource = myDataSet.Tables["Customers"].DefaultView;

dataGrid1.DataSource = myDataSet.Customers.DefaultView;

}

catch(Exception ex)

{

MessageBox.Show("Unable to retrieve Customer data: " + ex.Message);

}

} ...

Page 23: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

23

▣ SqlDataAdapter 와 SqlCommandBuilder 를 이용하여 데이터 추가 , 수정 , 삭제하기 ◈ SqlCommandBuilder 변수 선언

public class Form2 : System.Windows.Forms.Form

{

SqlConnection mySqlConnection;

//DataSet myDataSet;

Customer myDataSet;

...

SqlCommandBuilder cbCustomers;

...

Page 24: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

24

◈ 폼 디자인 설정

Name: btnSaveChanges

Text: Save Changes

Page 25: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

25

◈ 이벤트 생성– Get Data 버튼 컨트롤 더블 클릭 후 btnGetData_Click 메서드 코드

추가

private void btnGet_Click(object sender, System.EventArgs e)

{

...

mySqlDataAdapter1.Fill(myDataSet,"Customers");

mySqlDataAdapter2.Fill(myDataSet,"Orders");

cbCustomers = new SqlCommandBuilder(mySqlDataAdapter);

...

Page 26: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

26

– Save Changes 버튼 컨트롤 더블 클릭 후 btnSaveChanges_Click 메서드 코드 추가

private void btnSaveChanges_Click(object sender, System.EventArgs e)

{

try

{

mySqlDataAdapter.Update(myDataSet, "Customers");

MessageBox.Show("Changes Recorded Successfully into the Customers table.");

}

catch(Exception ex)

{

MessageBox.Show("Changes not saved: " + ex.Message);

}

}

Page 27: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

27

▣ 저장 프로시저 이용하기 ◈ 폼 디자인 설정

Name: btnSP

Text: Call SP

Page 28: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

28

◈ DataGridView 컨트롤의 DataSource 속성을 없음으로 선택

Page 29: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

29

◈ 이벤트 생성– Call SP 버튼 컨트롤 더블 클릭 후 btnSP_Click 메서드 코드 추가

private void btnSP_Click(object sender, System.EventArgs e)

{

try

{

SqlDataAdapter myDataAdapter = new SqlDataAdapter("CustOrderHist", mySqlConnection);

myDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;

myDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@CustomerID", SqlDbType.NVarChar, 5));

myDataAdapter.SelectCommand.Parameters["@CustomerID"].Value = "ALFKI";

DataSet ds = new DataSet();

myDataAdapter.Fill(ds, "Products");

dataGrid1.DataSource=ds.Tables["Products"].DefaultView;

}

catch(Exception ex)

{

MessageBox.Show("Error occurred: " + ex.Message);

}

}

Page 30: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

4. ADO Recordset 을 DataSet으로 로딩하기

Page 31: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

31

▣ Microsoft ActiveX Data Objects 참조 추가하기 ◈ Solution Explorer 의 Reference 항목을 오른쪽 마우스 버튼을 클릭한

다음 참조 추가를 선택

Page 32: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

32

◈ 참조 추가 대화 상자에서 COM 탭으로 전환 ◈ 구성 요소 이름 목록에서 Microsoft ActiveX Data Objects 2.7

Library 를 선택

Page 33: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

33

▣ ADO Recordset 을 DataSet 으로 로딩하기◈ Solution Explorer 의 프로젝트에서 마우스 오른쪽 버튼 클릭 후

[Add]-[Windows Form]

Page 34: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

34

◈ Form3.cs 소스 수정

...

using System.Windows.Forms;

using System.Data;

using System.Data.SqlClient;

using System.Data.OleDb;

using ADODB;

Page 35: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

35

◈ 폼 디자인 설정

Name: btnLoadRS

Text: Load Recordset

DataGridview 컨트롤

Page 36: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

36

◈ 이벤트 생성– Load Recordset 버튼 컨트롤 더블 클릭 후 btnLoadRS_Click 메서드

코드 추가

private void btnLoadRS_Click(object sender, System.EventArgs e)

{

try

{

RecordsetClass rsObj = new RecordsetClass();

string constr = "provider=sqloledb;server=localhost;database=Northwind; trusted_connection=yes";

rsObj.Open("Customers",constr,ADODB.CursorTypeEnum.adOpenForwardOnly,ADODB.LockTypeEnum.adLockReadOnly,0x200);

DataSet myDataSet = new DataSet();

OleDbDataAdapter adapter = new OleDbDataAdapter();

adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

adapter.Fill(myDataSet, rsObj, “Customers”);

dataGrid1.DataSource = myDataSet.Tables[“Customers”].DefaultView;

}

Page 37: 4. DataSet 과 DataAdapter. 2.NET 데이터 공급자 4.1 DataSet 과 DataAdapter 의 관계 Connection Command DataReader Transaction DataAdapter SelectCommand InsertCommand

37

catch(Exception ex)

{

MessageBox.Show("Error occured while retrieving the data: " + ex.Message);

}

}