Presentation is loading. Please wait.

Presentation is loading. Please wait.

4. DataSet과 DataAdapter.

Similar presentations


Presentation on theme: "4. DataSet과 DataAdapter."— Presentation transcript:

1 4. DataSet과 DataAdapter

2 4.1 DataSet과 DataAdapter의 관계
.NET 데이터 공급자 DataSet Connection DataAdapter DataTableCollection Transaction SelectCommand DataTable DataRowCollection InsertCommand Command DataColumnCollection Transaction UpdateCommand ConstraintCollection DeleteCommand DataReader DataRelationCollection Database XML

3 .Net에서 이용되는 데이터 구조 DataReader Command Database DataSet DataAdapter
연결지향 Database Connection DataSet DataAdapter 비연결지향

4 4.2 DataAdapter 속성과 함수 DataAdapter 속성 DataAdapter 주요 함수 DeleteCommand
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()

5 DataColumnCollection
4.3 DataSet의 구성요소 .Net DataSet 구성요소 Constraint DataColumn DataRow DataTable DataRelation DataColumn DataRow DataSet의 개념상의 구성요소 DataSet DataTable DataColumnCollection DataRowCollection DataTableCollection

6 DataSet의 계층구조 DataSet DataTable DataColumn DataRow
DataColumnCollection DataTableCollection DataColumnCollection DataTable DataColumnCollection DataColumnCollection DataColumnCollection DataColumnCollection DataRowCollection DataColumnCollection DataColumn DataRow

7 4.4 DataSet을 만드는 방법 I Connection 생성 및 Open DataAdapter 생성
string conStr = "Server=localhost;user id=sa;password=;database=northwind"; SqlConnection conn = new SqlConnection(conStr); conn.Open(); DataAdapter 생성 SqlDataAdapter adapter = new SqlDataAdapter(); SqlCommand 할당 string query = "select * from Address"; adapter.SelectCommand = new SqlCommand(query, conn); DataSet 생성 DataSet ds = new DataSet(); DataAdapter를 이용해서 DataSet 채우기 adapter.Fill(ds); 작업수행 연결 닫기 conn.Close();

8 4.5 DataSet으로 작업하기 Connenction 생성과 Open SqlDataAdapter 생성
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 Tables DataColumnCollection DataColumnCollection DataTableCollection DataTable DataColumnCollection DataColumnCollection DataColumnCollection DataColumnCollection DataColumnCollection DataRowCollection DataColumn DataRow Rows Columns

9 4.6 DataSet을 만드는 방법 II Connection 생성 및 Open DataSet 만들기 DataSet으로 작업하기
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();

10 DataSet의 InsertCommand 명령 수행
4.7 DataSet의 Update() DataSet에서 InsertCommand 명령을 수행하는 방법 DataSet 자체에 레코드를 삽입한다. DataAdapter에 SqlCommand를 지정한다. DataAdapter를 이용해서 DataSet을 데이터베이스로 업데이트한다. DataSet의 InsertCommand 명령 수행 DataSet DataColumnCollection DataTableCollection Database DataAdapter에 SqlCommand 지정 DataRow 2 1 DataTable (Insert 문장) 새로운 Row 삽입 DataRow row = table.NewRow(); row["id"] = "8"; row["name"] = "Uncle"; row["addr"] = "Ameria"; table.Rows.Add(row); 3 DataAdpater를 이용해서 Update()

11 SqlDataAdapter adapter = new SqlDataAdapter("select
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 adapter.InsertCommand = new SqlCommand(strSql, conn); SqlDbType.TinyInt, 0, "id"); SqlDbType.Char, 20, "name"); SqlDbType.Char, 40, "addr"); //3. DataAdapter를 이용하여 DataSet 업데이트하기 adapter.Update(ds, "Address");

12 4.8 DataSet 병합하기 DataSet 병합하기 DataSet 병합과정
DataSet ds1 = new DataSet(); DataSet ds2 = new DataSet(); 두개의 DataSet을 병합하기 위해서는 Merge() 함수 사용 ds1.Merge(ds2); ds1은 ds2와 병합된 데이터가 들어있다. ds1의 복사본 만들기 DataSet dsc = ds1.Copy();

13 4.9 DataSet의 관계 설정 DataTable 생성 DataSet에 DataTable 삽입 Relation 설정
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"]) ;

14 4.13 DataSet의 추가 자료 형식화된 DataSet으로 작업하기
Solution Explorer의 프로젝트에서 마우스 오른쪽 버튼 클릭 후 [Add]-[New Item]

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

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

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

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

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

20 Form2의 소스 수정 myDataSet 변수의 선언부분 변경
public class Form2 : System.Windows.Forms.Form { SqlConnection mySqlConnection; //DataSet myDataSet; Customer myDataSet; ...

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"]);

22 //dataGrid1.DataSource = myDataSet.Tables["Customers"].DefaultView;
dataGrid1.DataSource = myDataSet.Customers.DefaultView; } catch(Exception ex) { MessageBox.Show("Unable to retrieve Customer data: " + ex.Message); } ...

23 SqlDataAdapter와 SqlCommandBuilder를 이용하여 데이터 추가, 수정, 삭제하기
public class Form2 : System.Windows.Forms.Form { SqlConnection mySqlConnection; //DataSet myDataSet; Customer myDataSet; ... SqlCommandBuilder cbCustomers;

24 폼 디자인 설정 Name: btnSaveChanges Text: Save Changes

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);

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);

27 저장 프로시저 이용하기 폼 디자인 설정 Name: btnSP Text: Call SP

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

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 SqlDbType.NVarChar, 5)); = "ALFKI"; DataSet ds = new DataSet(); myDataAdapter.Fill(ds, "Products"); dataGrid1.DataSource=ds.Tables["Products"].DefaultView; } catch(Exception ex) MessageBox.Show("Error occurred: " + ex.Message);

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

31 Microsoft ActiveX Data Objects 참조 추가하기
Solution Explorer의 Reference 항목을 오른쪽 마우스 버튼을 클릭한 다음 참조 추가를 선택

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

33 ADO Recordset을 DataSet으로 로딩하기
Solution Explorer의 프로젝트에서 마우스 오른쪽 버튼 클릭 후 [Add]-[Windows Form]

34 Form3.cs 소스 수정 ... using System.Windows.Forms; using System.Data;
using System.Data.SqlClient; using System.Data.OleDb; using ADODB;

35 폼 디자인 설정 Name: btnLoadRS Text: Load Recordset DataGridview 컨트롤

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; }

37 catch(Exception ex) { MessageBox.Show("Error occured while retrieving the data: " + ex.Message); }


Download ppt "4. DataSet과 DataAdapter."

Similar presentations


Ads by Google