Home Full Site
C# DataSet 테이블 병합(Merge)

DataSet 혹은 DataTable은 Merge() 메서드를 사용하여 다른 DataSet, DataTable 혹은 DataRow들을 병합할 수 있다. 흔히 복수의 DataSet 객체가 있을 때 DataSet안의 데이타를 병합해야 하는 경우가 있는데, 이는 DataSet의 Merge() 메서드를 써서 해결할 수 있다. 하나의 예로서, 만약 두 개의 데이타베이스에 동일한 테이블명이 있고 이를 클라이언트에서 병합해야 하는 경우에는, 아래와 같이 두 테이블을 DataSet에 가져와 이를 병합해서 사용하면 된다. (물론 서버에서 병합할 수도 있다). Merge() 메서드는 테이블의 Primary Key를 기준으로 추가/삭제/변경된 레코드들을 해당 테이블에 병합하게 된다.

예제

DataSet ds1 = new DataSet();
DataSet ds2 = new DataSet();

string strConn1 = "Data Source=(local);Initial catalog=pubs;Integrated Security=SSPI;";
string strConn2 = "Data Source=(local);Initial catalog=pubs2;Integrated Security=SSPI;";

string sql = "SELECT * FROM authors";

// pubs DB에서 authors 테이블 가져오기 (23개 rows).
SqlDataAdapter adpt1 = new SqlDataAdapter(sql, strConn1);
adpt1.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adpt1.Fill(ds1);
adpt1.Dispose();

// pubs2 DB에서 authors 테이블 가져오기.
// (24개 rows : 1개 row가 추가되었고, 1 row가 Update됨)
SqlDataAdapter adpt2 = new SqlDataAdapter(sql, strConn2);
adpt2.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adpt2.Fill(ds2);
adpt2.Dispose();

// Merge후 authors에는 1개 추가 row와 갱신된 1개 row가 있음.
Console.WriteLine("Before Merge: {0}", ds1.Tables[0].Rows.Count);
ds1.Merge(ds2);
Console.WriteLine("After Merge: {0}", ds1.Tables[0].Rows.Count);

foreach (DataRow r in ds1.Tables[0].Rows)
{
    Console.WriteLine("{0}: {1} {2}", r[0], r[1], r[2]);
}

  • SqlDataAdapter가 DataSet에 데이타를 Fill 할 때, 디폴트로 MissingSchemaAction.Add 를 사용한다. 즉, DataSet에 (위의 예제와 같이) 컬럼들이 이미 수작업으로 정의하고 있지 않으면, 컬럼명과 타입을 자동으로 추가하게 된다. MissingSchemaAction.AddWithKey는 여기에 하나 더 Primary Key 정보를 데이타소스에서 읽어와 추가하게 된다. 즉, DataSet에 데이타가 Fill 되기 전에 기본 컬럼 스키마를 정의하고 또한 Primary Key를 미리 정의하게 된다. AddWithKey로 정의한 후 Fill이 실행될 때, 동일한 Primary Key값이 추가되면 Row는 Append되지 않고 Update된다.




C# DataSet 테이블 추가 합병

두 DataSet 객체가 서로 다른 테이블들을 가지고 있을 때 Merge()를 실행하면, Merge()를 호출하는 DataSet 객체안으로 다른 DataSet에 있는 테이블들을 추가 복제하여 병합할 수 있다. 아래 예는 첫번째 DataSet객체에는 authors 테이블을 읽어 오고, 두번째 DataSet에는 titles과 employee 2개의 테이블들을 가져온다. 이후 첫번째 DataSet객체에 Merge()를 실행하여 두번째 DataSet의 2개의 테이블을 추가 합병하게되어 첫번째 DataSet은 총 3개의 DataTable을 갖게된다.

예제

DataSet ds1 = new DataSet();
DataSet ds2 = new DataSet();
string strConn1 = "Data Source=(local);Initial catalog=pubs;Integrated Security=SSPI;";

// ds1 에는 authors 테이블
string sql = "SELECT * FROM authors";

SqlDataAdapter adpt1 = new SqlDataAdapter(sql, strConn1);
adpt1.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adpt1.Fill(ds1);
adpt1.Dispose();

// ds2 에는 titles 테이블과 employee 테이블 2개
sql = "SELECT * FROM titles; SELECT * FROM employee";

SqlDataAdapter adpt2 = new SqlDataAdapter(sql, strConn1);
adpt2.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adpt2.Fill(ds2);
adpt2.Dispose();

// ds2의 두 테이블을 ds1으로 병합
ds1.Merge(ds2);

// 병합 후 ds1에는 총 3개의 테이블이 존재
foreach (DataRow r in ds1.Tables[0].Rows)
{
    Console.WriteLine(r[0]);
}
foreach (DataRow r in ds1.Tables[1].Rows)
{
    Console.WriteLine(r[0]);
}
foreach (DataRow r in ds1.Tables[2].Rows)
{
    Console.WriteLine(r[0]);
}



C# 특정 DataTable 병합

특정 DataTable을 병합하는 경우 해당 DataTable 객체에서 Merge()메서드를 호출하여 다른 테이블을 병합하게 된다. 아래의 예처럼 하나의 데이타베이스 안에 동일한 구조를 가진 두 개의 테이블이 있는 경우, 이를 병합하기 위해 하나의 DataSet에 두 개의 DataTable을 생성하고 이를 한쪽으로 Merge할 수 있다.

예제

DataSet ds1 = new DataSet();
string strConn2 = "Data Source=(local);Initial catalog=pubs2;Integrated Security=SSPI;";

// authors 테이블을 authors1 DataTable에 채움
string sql = "SELECT * FROM authors";
SqlDataAdapter adpt = new SqlDataAdapter(sql, strConn2);
adpt.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adpt.Fill(ds1, "authors1");

// authors2 테이블을 authors2 DataTable에 채움
sql = "SELECT * FROM authors2";
adpt = new SqlDataAdapter(sql, strConn2);
adpt.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adpt.Fill(ds1, "authors2");

// authors2 DataTable을 authors1 DataTable에 병합
ds1.Tables["authors1"].Merge(ds1.Tables["authors2"]);

foreach (DataRow r in ds1.Tables["authors1"].Rows)
{
    Console.WriteLine("{0}: {1} {2}", r[0], r[1], r[2]);
}



© csharpstudy.com