25. 관계와 제약조건걸기(DataRelation 클래스와 Constraints)
.NET프로그래밍/ADO.NET 2009. 9. 30. 10:16 |
* "윈폼"에서 '새 프로젝트 만들기'로 프로젝트 실행(프로젝트명은 WinDataRelation)
==> Form1.cs [디자인]
-------------------------------------------------------------------------------------
==> Form1.cs 소스
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace WinDataRelation
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private DataSet ds; // DataSet을 필드레벨로 올림(다른 이벤트핸들러에서도 사용할 수 있도록 하기 위해서... / 전역변수)
private void Form1_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=.;database=Market;uid=Market;pwd=6750440;";
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "Select CategoryID, CategoryName From Categories";
cmd.CommandType = CommandType.Text;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
ds = new DataSet(); //
da.Fill(ds, "Categories");
cmd.CommandText = "Select ProductID, CategoryID, ModelName From Products";
da.SelectCommand = cmd;
da.Fill(ds, "Products");
// Categories테이블과 Productㄴ테이블간에 관계설정(메모리상에서...)
// 부모 레코드를 삭제하면, 관련 자식 레코드들도 삭제된다.
//ds.Relations.Add(
// new DataRelation(
// "CP", // 관계명(별칭)
// ds.Tables[0].Columns["CategoryID"], // 부모컬럼
// ds.Tables[1].Columns["CategoryID"] // 자식컬럼
// )
//);
//[2] 제약조건 걸기
// 부모 레코드 삭제시 자식이 참조하고 있으면 에러가 난다.
ds.Tables["Products"].Constraints.Add(
new ForeignKeyConstraint(
"PK_Pro", // 제약조건명
ds.Tables[0].Columns["CategoryID"], // 부모컬럼
ds.Tables[1].Columns["CategoryID"] // 자식컬럼
)
);
//[3] 삭제 규칙 적용
((ForeignKeyConstraint)ds.Tables[1].Constraints["PK_Pro"]).DeleteRule =
Rule.None; // 에러발생한다. / "Rule"이라는 이름의 열거형
//Rule.Cascade; // 부모테이블의 레코드와 자식테이블의 레코드 둘다 삭제된다.(Cascade가 기본값이다.)
this.dataGridView1.DataSource = ds.Tables[0];
this.dataGridView2.DataSource = ds.Tables[1];
}
private void button1_Click(object sender, EventArgs e)
{
// XML로 저장
ds.Tables[0].WriteXml("C:\\Category.xml", XmlWriteMode.WriteSchema);
MessageBox.Show("XML로 저장 완료");
}
private void button2_Click(object sender, EventArgs e)
{
// XML 데이터 읽어오기
DataTable read = new DataTable();
read.ReadXml(@"C:\Category.xml");
this.dataGridView1.DataSource = read; // 재 바인딩
}
}
}
// "SqlDataAdapter 클래스"를 사용하면 SqlConnection을 Open, Close 하지 않아도 된다.(SqlDataAdapter 클래스가 con.Open()메서드와 con.Close()메서드의 기능을 포함하고 있다.)
// SqlDataAdapter 클래스 - DataSet를 채우고 SQL Server 데이터베이스를 업데이트하는 데 사용할 데이터 명령 집합과 데이터베이스 연결을 나타냅니다. 이 클래스는 상속될 수 없습니다.
// DataRelation 클래스 - 두 개의 DataTable 개체 사이의 부모/자식 관계를 나타냅니다.
// ForeignKeyConstraint 클래스 - 값 또는 행이 삭제되거나 업데이트될 때 기본 키/외래 키 관계에서 열 집합에 적용되는 동작 제한을 나타냅니다.
// Rule 열거형 - ForeignKeyConstraint가 적용될 때 발생하는 작업을 나타냅니다.
// XmlWriteMode 열거형 - DataSet에서 XML 데이터와 관계형 스키마를 쓰는 방법을 지정합니다.
-------------------------------------------------------------------------------------
[실행결과]
--> "XML로 저장"버튼을 누르면 "XML로 저장 완료"메시지박스가 출력되며 C드라이브에 "Category.xml"파일이 만들어지고 저장된다.
--> C드라이브에 생성되어 저장된 "Category.xml"파일
--> Form1의 왼쪽 "GridView"화면에서 "CategoryID"가 34, 35, 36인 데이터를 삭제해보면...
--> Form1의 왼쪽 "GridView"화면에서 "CategoryID"가 34, 35, 36인 데이터가 삭제되었는데...
--> 아래그림에서 Form1의 "XML에서 읽어오기"버튼을 누르면 C드라이브에 저장되어있는 "Category.xml"파일을 읽어와서 왼쪽"GridView"에 삭제되었던 데이터를 포함하여 "Category.xml"파일에 저장되어있던 모든 데이터가 출력된다.
'.NET프로그래밍 > ADO.NET' 카테고리의 다른 글
(교재실습) WinCommandBuilder(SqlCommandBuilder 클래스) (0) | 2009.09.30 |
---|---|
(교재실습) (DataAdapter 연습) (0) | 2009.09.30 |
(교재실습) MakeDataSet(DateSet연습) (0) | 2009.09.30 |
(교재실습) MakeTable(DataTable / DataColumn / DataRow 연습) (0) | 2009.09.29 |
24. DataTable..::.Select 메서드 (0) | 2009.09.29 |