Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 21 장 : ADO.NET 을 이용한 데이터 접근. ADO.NET - DataSet 사용하기.

Similar presentations


Presentation on theme: "제 21 장 : ADO.NET 을 이용한 데이터 접근. ADO.NET - DataSet 사용하기."— Presentation transcript:

1 제 21 장 : ADO.NET 을 이용한 데이터 접근

2 ADO.NET - DataSet 사용하기

3 학습목표 DataSet 모델 DataSet 과 관련된 중요 객체 DataTable 의 중요 멤버 DataRow 의 중요 멤버 DataSet 테이블 및 필드 추가히기 DataSet 레코드 삽입하기 DataSet 레코드 변경 DataSet 데이터 검색 DataSet 제약 사항 추가

4 DataSet 객체 모델 DataSet 객체 모델 – 메모리 상의 데이터 베이스

5 DataSet 과 관련된 중요 객체 –DataTable –DataRow –DataRelation –DataColumn –DataView –DataSetView –DataRowView –…

6 ds.Tables["DSTitles"].Rows[i]["title_id"].ToString()); Tables : Collection DataTable 의 중요 멤버 –Rows, Columns, TableName –AcceptChanges(), RejectChanges() //Update, Delete 시 반드시 호출해야만 수행 –NewRow() –Constraints, PrimaryKey –ChildRelations –DefaultView DataTable

7 ds.Tables["DSTitles"].Rows[i]["title_id"].ToString()); Rows : Collection DataRow 의 중요 멤버 –Delete() –AcceptChages(), RejectChanges() –BeginEdit(), EndEdit() // AcceptChanges() 메소드 자동 호출된다. –GetChildRows() –RowState DataRow

8 DataTable orders = ds.Tables.Add("Orders"); orders.Columns.Add("ord_id",typeof(int)); orders.Columns.Add("amount",typeof(int)); orders.Columns.Add("employee_id",typeof(int)); orders.Columns.Add("product_id",typeof(int)); DataTable products = ds.Tables.Add("Products"); products.Columns.Add("product_id", typeof(int)); products.Columns.Add("product_name",typeof(string)); DataTable orders = ds.Tables.Add("Orders"); orders.Columns.Add("ord_id",typeof(int)); orders.Columns.Add("amount",typeof(int)); orders.Columns.Add("employee_id",typeof(int)); orders.Columns.Add("product_id",typeof(int)); DataTable products = ds.Tables.Add("Products"); products.Columns.Add("product_id", typeof(int)); products.Columns.Add("product_name",typeof(string)); DataSet 테이블 및 필드 추가하기

9 DataRow newrow = ds.Tables["DataSetTitles"].NewRow(); newrow["title_id"] = “XXX"; newrow["title"] = “ 타이틀 제목 "; ds.Tables["DataSetTitles"].Rows.Add(newrow); DataRow newrow = ds.Tables["DataSetTitles"].NewRow(); newrow["title_id"] = “XXX"; newrow["title"] = “ 타이틀 제목 "; ds.Tables["DataSetTitles"].Rows.Add(newrow); DataSet 에러코드 삽입하기 DataSet 내의 레코드 삽입

10 ds.Tables["DataSetTitles"].Rows[0].Delete(); // ds.Tables["DataSetTitles"].RejectChanges(); ds.Tables["DataSetTitles"].AcceptChanges(); ds.Tables["DataSetTitles"].Rows[0].Delete(); // ds.Tables["DataSetTitles"].RejectChanges(); ds.Tables["DataSetTitles"].AcceptChanges(); DataSet 사용하기 DataSet 내의 레코드 삭제

11 ds.Tables["DataSetTitles"].Rows[0].BeginEdit(); ds.Tables["DataSetTitles"].Rows[0]["title"] = " 타이틀 바꿈 "; ds.Tables["DataSetTitles"].Rows[0].EndEdit(); // ds.Tables["DataSetTitles"].AcceptChanges() ds.Tables["DataSetTitles"].Rows[0].BeginEdit(); ds.Tables["DataSetTitles"].Rows[0]["title"] = " 타이틀 바꿈 "; ds.Tables["DataSetTitles"].Rows[0].EndEdit(); // ds.Tables["DataSetTitles"].AcceptChanges() DataSet 사용하기 DataSet 내의 레코드 변경 호출할 필요 없다.

12 DataRelation relation = new DataRelation("T_TAuthor", ds.Tables["DataSetTitles"].Columns["title_id"], ds.Tables["DataSetTitleAuthor"].Columns["title_id"]); ds.Relations.Add(relation); DataRelation relation = new DataRelation("T_TAuthor", ds.Tables["DataSetTitles"].Columns["title_id"], ds.Tables["DataSetTitleAuthor"].Columns["title_id"]); ds.Relations.Add(relation); DataSet 사용하기 DataSet 내의 두 테이블 관계 맺기

13 DataRow[] childtrows = ds.Tables["DataSetTitles"].Rows[0].GetChildRows ("T_TAuthor") ci = 0; while(ci < childrows.Length) { Console.WriteLine(childrows[ci]["au_id"].ToString()); ci++; } DataRow[] childtrows = ds.Tables["DataSetTitles"].Rows[0].GetChildRows ("T_TAuthor") ci = 0; while(ci < childrows.Length) { Console.WriteLine(childrows[ci]["au_id"].ToString()); ci++; } DataSet 사용하기 DataSet 내의 관계를 이용한 데이터 검색

14 ds.Tables["DSTitles"].PrimaryKey = new DataColumn[] { ds.Tables["DSTitles"].Columns["title_id"]}; ds.Tables["DSTitles"].Columns["title_id"].AllowDBNull = false; ds.Tables["DSTitles"].Columns["title_id"].Unique = true; ds.Tables["DSTitles"].Columns["title_id"].DefaultValue = "BU0000“; ds.Tables["DSTitles"].PrimaryKey = new DataColumn[] { ds.Tables["DSTitles"].Columns["title_id"]}; ds.Tables["DSTitles"].Columns["title_id"].AllowDBNull = false; ds.Tables["DSTitles"].Columns["title_id"].Unique = true; ds.Tables["DSTitles"].Columns["title_id"].DefaultValue = "BU0000“; DataSet 사용하기 DataSet 내의 테이블에 제약 설정 하기

15 데모 1. 프로젝트 생성 및 폼 디자인

16 데모 2. 코드 삽입 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace AdoDataset { /// /// Summary description for Form1. /// public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.DataGrid dataGrid1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button3; private System.Windows.Forms.Button button4; … static void Main() { Application.Run(new Form1()); }

17 데모 2. 코드 삽입 DataSet ds = new DataSet(); DataTable roans; DataTable books; private void button4_Click(object sender, System.EventArgs e) { roans = ds.Tables.Add("Roans"); roans.Columns.Add("amount", typeof(int)); roans.Columns.Add("sabun", typeof(int)); roans.Columns.Add("books_id", typeof(int)); books = ds.Tables.Add("Books"); books.Columns.Add("books_id", typeof(int)); books.Columns.Add("books_name", typeof(string)); books.Columns["books_id"].AutoIncrement = true; books.PrimaryKey = new DataColumn[] { books.Columns["books_id"]}; books.Columns["books_id"].Unique = true; books.Columns["books_id"].AllowDBNull = true; dataGrid1.DataSource = books; } private void button1_Click(object sender, System.EventArgs e) { DataRow newrow = books.NewRow(); newrow["books_name"] = textBox1.Text; books.Rows.Add(newrow); }

18 데모 2. 코드 삽입 private void button2_Click(object sender, System.EventArgs e) { int idx = dataGrid1.CurrentRowIndex; books.Rows[idx].BeginEdit(); books.Rows[idx]["books_name"] = textBox1.Text; books.Rows[idx].EndEdit(); } private void button3_Click(object sender, System.EventArgs e) { int idx = dataGrid1.CurrentRowIndex; books.Rows[idx].Delete(); books.AcceptChanges(); //books.Row[current_product_id].RejectChanges(); dataGrid1.CurrentRowIndex = 0; }

19 ADO.NET SQL Server.NET DataProvider - SqlDataAdapter 데이터 추출

20 학습 목표 SqlDataAdapter 와 DataSet SqlDataAdapter 의 주요 멤버 SqlDataAdapter 를 이용한 데이터 추출 데모 DataView 사용

21 ord_idprod_idamount 1BU1032200 2BU0312300 Data Source DataSet in Memory Table Mapping - Orders to Orders SqlDataAdapter.SelectCommand SqlDataAdapter.UpdateCommand.InsertCommand.DeleteCommand ord_idprod_idamount 1BU1032200 2BU0312300 SqlDataAdapter 와 DataSet

22 SqlDataAdapter 의 주요 멤버 –SelectCommand, InsertCommand, UpdateCommand, DeleteCommand –Fill(), // SelectCommand() 를 이용해서 실제 데이터 저장소로부터 데이터를 스키마 // 를 생성한 후 이를 가져오는 역할을 한다. –Update() –TableMappings SqlDataAdapter 의 주요 이벤트 –RowUpdated, RowUpdating

23 sqlConnection1.ConnectionString = @"server=ADMIN\SQL2000;uid=sa;pwd=;database=pubs;"; SqlCommand comd = new SqlCommand (@"Select * From Titles",sqlConnection1); SqlDataAdatper dsc = new SqlDataAdaptor(); dsc.SelectCommand = comd; DataSet ds = new DataSet(); dsc.Fill(ds,"DSTitles"); int i = 0; while(i < ds.Tables["DSTitles"].Rows.Count) { Console.WriteLine( ds.Tables["DSTitles"].Rows[i]["title_id"].ToString()); i++; } sqlConnection1.ConnectionString = @"server=ADMIN\SQL2000;uid=sa;pwd=;database=pubs;"; SqlCommand comd = new SqlCommand (@"Select * From Titles",sqlConnection1); SqlDataAdatper dsc = new SqlDataAdaptor(); dsc.SelectCommand = comd; DataSet ds = new DataSet(); dsc.Fill(ds,"DSTitles"); int i = 0; while(i < ds.Tables["DSTitles"].Rows.Count) { Console.WriteLine( ds.Tables["DSTitles"].Rows[i]["title_id"].ToString()); i++; } SqlDataAdapter 를 이용한 데이터 추출 SqlDataAdaptor 의 사용

24 DataView dv; dv = new DataView (ds.Tables["Authors“]); dv.RowFilter = "state = 'CA'" ; DataView dv; dv = new DataView (ds.Tables["Authors“]); dv.RowFilter = "state = 'CA'" ; DataView dv; dv = ds.Tables["Authors“].DefaultView; DataView dv; dv = ds.Tables["Authors“].DefaultView; DataView 사용 DataTable 의 데이터 중 원하는 데이터만 걸러내기위해서 사용 DataTable 의 DefaultView 프로퍼티 –DataTable 의 전체 데이터를 반환하는 DataView 객체 DataView.RowFilter 프로퍼티 사용하기 DataTable.DefaultView 프로퍼티 사용하기

25 1. 프로젝트 생성 및 폼 디자인 TreeView

26 2-1. SqlCommand1

27 2-2. SqlCommand1

28 2-2. SqlCommand2 CommandText Connection

29 3. 어댑터 프로그램 작성 DataSet Sehyun = new DataSet(); private void button1_Click(object sender, System.EventArgs e) { SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = sqlCommand1; adapter.Fill(Sehyun,"iOrders"); adapter.SelectCommand = sqlCommand2; adapter.Fill(Sehyun,"iProducts"); Sehyun.Relations.Add( "ProductsOrders", Sehyun.Tables["iProducts"].Columns["product_id"], Sehyun.Tables["iOrders"].Columns["product_id"] ); TreeNode root = new TreeNode(" 제품들 "); treeView1.Nodes.Add(root); for(int i=0;i < Sehyun.Tables["iProducts"].Rows.Count; ++i) { TreeNode productNode = root.Nodes.Add( (string) Sehyun.Tables["iProducts"].Rows[i]["product_name"]); DataRow[] childRows; childRows = Sehyun.Tables["iProducts"].Rows[i].GetChildRows("ProductsOrders"); for(int k=0; k<childRows.Length; k++) productNode.Nodes.Add(childRows[k]["amount"].ToString()); }

30 4. 데이터 뷰 프로그램 private void button2_Click(object sender, System.EventArgs e) { DataView dv; dv = new DataView(Sehyun.Tables["iOrders"]); dv.RowFilter = "product_id = 3"; foreach(DataRowView drv in dv) { MessageBox.Show(drv["amount"].ToString()); }

31 ADO.NET SQL Server.NET DataProvider - SqlDataAdapter 데이터 갱신

32 학습 목표 SqlDataAdapter 와 DataSet SqlDataAdapter 의 주요 멤버 SqlDataAdapter 를 이용한 데이터 갱신 데모

33 ord_idprod_idamount 1BU1032200 2BU0312300 Data Source DataSet in Memory Table Mapping - Orders to Orders SqlDataAdapter.SelectCommand SqlDataAdapter.UpdateCommand.InsertCommand.DeleteCommand ord_idprod_idamount 1BU1032200 2BU0312300 SqlDataAdapter 와 DataSet

34 SqlDataAdapter 의 주요 멤버 –SelectCommand, InsertCommand, UpdateCommand, DeleteCommand –Fill(), Update() –TableMappings SqlDataAdapter 의 주요 이벤트 –RowUpdated, RowUpdating

35 New300BU10112 Modified300BU10102 300 200 amount UnchangedBU10112 DeletedBU10321 DataRow.RowStateprod_idord_id SqlDataAdapter.Update() 호출 시 DataRow.Deleted 레코드 - SqlDataAdapter.DeleteCommand 에 의해 삭제 DataRow.Modified 레코드 - SqlDataAdapter.UpdateCommand 에 의해 갱신 DataRow.New 레코드 - SqlDataAdapter.InsertCommand 에 의해 추가 OrdersDS.GetChanges(System.Data.DataRowState.Deleted) OrdersDS.GetChanges(System.Data.DataRowState.Modified)... SqlDataAdapter 를 이용한 데이터 갱신 (1) 메모리 상에서 Flag 가 덧붙는다. Delete Flag 가 붙은 것을 가져와서 테이블을 만들어라

36 ord_idprod_idamount 1BU1032200 2BU0312300 ord_idprod_idamount 1BU1032200 2BU0312300 Data Source – Orders SqlDataAdapter.UpdateCommand.InsertCommand.DeleteCommand.Update DataSet in Memory – Orders SqlParameter.SourceColumn 으로 지정 SqlDataAdapter 를 이용한 데이터 갱신 (2)

37 데모 데이터 갱신 DataSet.GetChanges() 이벤트 데이터 추가

38 1. 프로젝트 생성 및 폼 디자인 TreeView 데이터 갱신

39 2-1. SqlCommand1 데이터 갱신

40 2-2. SqlCommand1 데이터 갱신

41 2-2. SqlCommand2 CommandText Connection 데이터 갱신

42 3. 어댑터 프로그램 작성 DataSet Sehyun = new DataSet(); private void button1_Click(object sender, System.EventArgs e) { SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = sqlCommand1; adapter.Fill(Sehyun,"iOrders"); adapter.SelectCommand = sqlCommand2; adapter.Fill(Sehyun,"iProducts"); Sehyun.Relations.Add( "ProductsOrders", Sehyun.Tables["iProducts"].Columns["product_id"], Sehyun.Tables["iOrders"].Columns["product_id"] ); TreeNode root = new TreeNode(" 제품들 "); treeView1.Nodes.Add(root); for(int i=0;i < Sehyun.Tables["iProducts"].Rows.Count; ++i) { TreeNode productNode = root.Nodes.Add( (string) Sehyun.Tables["iProducts"].Rows[i]["product_name"]); DataRow[] childRows; childRows = Sehyun.Tables["iProducts"].Rows[i].GetChildRows("ProductsOrders"); for(int k=0; k<childRows.Length; k++) productNode.Nodes.Add(childRows[k]["amount"].ToString()); } 데이터 갱신

43 4. AfterSelect 속성 추가 private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) { textBox1.Text = e.Node.Text; } 데이터 갱신

44 5. Update 버튼 이벤트 핸들러 추가 bool NodeTest(TreeNode node, int depth) { if(node == null) return false; else if(depth == 0) return true; return NodeTest(node.Parent, depth-1); } private void button2_Click(object sender, System.EventArgs e) { if( NodeTest(treeView1.SelectedNode,2) ) treeView1.SelectedNode.Text = textBox1.Text; } 데이터 갱신

45 6-1. sqlCommand3 추가 – Update 용 추가 데이터 갱신

46 6-2. sqlCommand3 추가 – Update 용 CommandText 데이터 갱신

47 6-3. sqlCommand3 추가 – Update 용 데이터 갱신

48 7. Save 버튼 이벤트 핸들러 추가 private void button3_Click(object sender, System.EventArgs e) { DataTable products = Sehyun.Tables["iProducts"]; TreeNodeCollection productNodes = treeView1.Nodes[0].Nodes; for(int i=0; i<productNodes.Count; ++i) { DataRow[] childRows = products.Rows[i].GetChildRows("ProductsOrders"); int node_num = 0; foreach(DataRow row in childRows) { row.BeginEdit(); if((int) row["amount"] == Int32.Parse(productNodes[i].Nodes[node_num].Text)) { row.RejectChanges(); node_num++; continue; } row["amount"] = Int32.Parse(productNodes[i].Nodes[node_num].Text); row.EndEdit(); node_num++; } SqlDataAdapter adapter = new SqlDataAdapter(); adapter.UpdateCommand = sqlCommand3; adapter.Update(Sehyun, “ iOrders"); } 데이터 갱신

49 1. button3_Click() 함수에 다음의 코드 추가 private void button3_Click(object sender, System.EventArgs e) { … // DataSet.GetChagnes Demo DataSet temp = Sehyun.GetChanges(DataRowState.Modified); string result = ""; for(int j=0;j<temp.Tables[0].Rows.Count;++j) result = result + "/" + temp.Tables[0].Rows[j]["amount"].ToString(); MessageBox.Show(result); /////////////////////////////////////////////////////////////////// SqlDataAdapter adapter = new SqlDataAdapter(); adapter.UpdateCommand = sqlCommand3; adapter.Update(Sehyun, “ iOrders"); } DataSet.GetChanges()

50 1. button3_Click() 함수에 다음의 코드 추가 private void button3_Click(object sender, System.EventArgs e) { SqlDataAdapter adapter = new SqlDataAdapter(); adapter.UpdateCommand = sqlCommand3; adapter.RowUpdated += new SqlRowUpdatedEventHandler (OnRowUpdated); adapter.RowUpdating += new SqlRowUpdatingEventHandler (OnRowUpdating); adapter.Update(Sehyun, “ iOrders"); } void OnRowUpdated(object s, SqlRowUpdatedEventArgs e) { MessageBox.Show(e.Row["amount"].ToString() + e.Row.RowState.ToString() +" Updated"); } void OnRowUpdating(object s, SqlRowUpdatingEventArgs e) { MessageBox.Show(e.Row["amount"].ToString() + e.Row.RowState.ToString() + " Updating"); } 이벤트 핸들러 추가

51 1. sqlCommand4 추가 데이터 추가

52 2. Connection, CommandText 수정 데이터 추가

53 3. Parameters 확인 데이터 추가

54 4. Button4_Click() 이벤트 작성 데이터 추가 private void button4_Click(object sender, System.EventArgs e) { DataRow newrow = Sehyun.Tables["iProducts"].NewRow(); newrow["product_id"] = 9999; newrow["product_name"] = textBox2.Text; Sehyun.Tables["iProducts"].Rows.Add(newrow); SqlDataAdapter adapter = new SqlDataAdapter(); adapter.InsertCommand = sqlCommand4; adapter.Update(Sehyun,"iProducts"); }

55 Typed DataSet 생성 및 사용

56 학습목표 Typed DataSet 이란 ? XML Schema 와 Typed DataSet Typed DataSet 생성

57 Typed DataSet 이란 ? 데이터 베이스의 각 요소 ( 테이블, 필드, 제약 … ) 를 멤버화 한 데이터 객체 DataSet 을 상속 XML Schema 를 기반으로 Visual Studio.NET 에서 자동 생성 장점 – 컴파일 시 타입 에러 발견 – 컴포넌트화가 가능 하다. – 이름 완성 기능 사용 등으로 사용이 간편 (. 을 찍으면 속성이 나오는 것을 의미 )

58 ord_id (Int)prod_id (Char)amount (int) 1BU1032200 2BU1010300 DataSet 내의 Orders 테이블 class OrdersDataSet : DataSet { class OrdersTable : DataTable { class OrdersRow : DataRow { int ord_id; string pord_id int amount; } OrdersRow[] Item; } OrdersTable Orders; } class OrdersDataSet : DataSet { class OrdersTable : DataTable { class OrdersRow : DataRow { int ord_id; string pord_id int amount; } OrdersRow[] Item; } OrdersTable Orders; } XML Schema XML Schema 와 Typed DataSet

59 Typed DataSet 생성 Typed DataSet 생성 순서  XML Schema 생성 DataSet 생성 위저드 Server Explorer 이용 XML Schema 편집  Typed DataSet 생성

60 데모


Download ppt "제 21 장 : ADO.NET 을 이용한 데이터 접근. ADO.NET - DataSet 사용하기."

Similar presentations


Ads by Google