2010. 4. 2. 20:44


DataSet -  여러개의 테이블로 구성되있다.



DataTable의 구성요소

DataRow(행에 대한 정보)
DataColumn(열에 대한 정보)
Constraint(값을 제어하는 규약)
DataRelation(두 테이블 간의 관계)



DataRelation(관계)

- DataColumn 개체를 통해 두 개의 DataTable 개체를 서로 연결하는데 사용

- 부모 및 자식 테이블의 일치하는 열 간에 관계가 만들어짐

- DataSet 내의 한 DataTable에서 다른 DataTable로 이동을 허용





또 다른 예제

static void Main(string[] args)
{
DataSet dataSet = new DataSet("MyData");
DataTable table = new DataTable("MyTable");
DataRow row;

table.Columns.Add("이름", typeof(string));       //컬럼 추가
table.Columns.Add("나이", typeof(int));
table.Columns.Add("학번", typeof(string));

 

//레코드 추가
row = table.NewRow();
row["이름"] = "천정민";
row["나이"] = 26;
row["학번"] = "123456789";
table.Rows.Add(row);

row = table.NewRow();
row["이름"] = "조아라";
row["나이"] = 23;
row["학번"] = "123456789";
table.Rows.Add(row);

row = table.NewRow();
row["이름"] = "안용준";
row["나이"] = 26;
row["학번"] = "987654321";
table.Rows.Add(row);

dataSet.Tables.Add(table);     //DataSet에 테이블 추가

 

//table 테이블 레코드 변경전

Console.WriteLine("table 테이블 레코드 변경전");
DataRow[] r = dataSet.Tables["MyTable"].Select();
foreach (DataRow ro in r)
{
    Console.WriteLine("이름 : " + ro["이름"].ToString() + " 나이 : " + ro["나이"].ToString() + " 학번 : " + ro["학번"].ToString());
}

Console.WriteLine();

 

//table 테이블 레코드변경
dataSet.Tables["MyTable"].Rows[0].Delete();           //테이블 삭제
dataSet.Tables["MyTable"].Rows[0].BeginEdit();        //수정시작
dataSet.Tables["MyTable"].Rows[0]["이름"] = "송창은";   //레코드 값 변경
dataSet.Tables["MyTable"].Rows[0].EndEdit();          //수정끝
dataSet.Tables["MyTable"].Rows[0].AcceptChanges();    //변경된 내용 실행

 

//table 레코드 값 얻어오기
Console.WriteLine("table 레코드 값 변경 후");
DataRow[] r2 = dataSet.Tables["MyTable"].Select();
foreach (DataRow ro in r2)
{
    Console.WriteLine("이름 : " + ro["이름"].ToString() + " 나이 : " +
ro["나이"].ToString() + " 학번 : " + ro["학번"].ToString());
}

Console.WriteLine();

 

//다른 테이블 생성 및 레코드 생성
DataTable OtherTable = new DataTable("OtherTable");
OtherTable.Columns.Add("학번", typeof(string));
OtherTable.Columns.Add("학년", typeof(int));

row = OtherTable.NewRow();
row["학번"] = "123456789";
row["학년"] = 4;
OtherTable.Rows.Add(row);

row = OtherTable.NewRow();
row["학번"] = "123456789";
row["학년"] = 3;
OtherTable.Rows.Add(row);

dataSet.Tables.Add(OtherTable);     //DataSet 추가

 

//OtherTable 레코드 값 얻어오기
Console.WriteLine("OtherTable 레코드 값 출력");
DataRow[] or = dataSet.Tables["OtherTable"].Select();
foreach (DataRow dr in or)
{
    Console.WriteLine("학번 : " + dr[0].ToString() + " 학년 : " + dr[1].ToString());
}

Console.WriteLine();


//pk설정
dataSet.Tables["Mytable"].PrimaryKey = new DataColumn[] { dataSet.Tables["Mytable"].Columns["학번"] };

 

//Relation 설정
DataRelation rel = new DataRelation("Stu", dataSet.Tables["Mytable"].Columns["학번"], dataSet.Tables["OtherTable"].Columns["학번"]);
dataSet.Relations.Add(rel);

 

//Relation 관계에서 부모에 해당하는 Row값으로 자식의 Row값을 출력
Console.WriteLine("Relation 관계에서 부모에 해당하는 Row값으로 자식의 Row값을 검색");
DataRow[] childrow = dataSet.Tables["MyTable"].Rows[0].GetChildRows("Stu");
//부모테이블의 0번째 row를 관계맺은 컬럼을 자식테이블에서 찾아라
foreach (DataRow cr in childrow) //childrow에 있는 값을 DataRow형식으로 가지고 오겠다
{
    Console.WriteLine("학번 : " + cr[0].ToString() + " 학년 : " + cr[1].ToString());
}
Console.WriteLine();

 

//테이블 갯수 출력
Console.WriteLine("테이블 수 : " + dataSet.Tables.Count);

//테이블 명 출력
foreach (DataTable t in dataSet.Tables)
{
    Console.WriteLine("테이블 명 : " + t.ToString());
}
//Console.WriteLine("테이블 명 : " + dataSet.Tables[0]);
//Console.WriteLine("테이블 명 : " + dataSet.Tables[1]);

//컬럼 명 출력
Console.WriteLine("컬럼 명");
foreach (DataColumn dc in dataSet.Tables[0].Columns)
{
    Console.Write(dc.ColumnName + " ");
}
Console.WriteLine();
}

'.NET > ADO.NET' 카테고리의 다른 글

DB모델링  (0) 2010.05.28
SqlDataAdapter  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
SqlParameter 클래스  (0) 2010.03.31
Posted by 아몰라