* "윈폼"에서 '새 프로젝트 만들기'로 프로젝트 실행(프로젝트명은 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"파일에 저장되어있던 모든 데이터가 출력된다.




 

 

Posted by holland14
: