Download presentation
Presentation is loading. Please wait.
Published byAlexis Rodgers Modified over 8 years ago
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
데모
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.