본문 바로가기

programming/XML

XML과 DB와의 연동 (xml <->DataSet <-> DB Table)

  지금 해보고자 하는 것은 DataBase(앞으론 줄여서 DB)에 있는 테이블의 데이터를 XML 파일로 작성하고, 또한 XML 파일을 DB 테이블을 옮기는 것입니다.. 역시 알고나니....-_-;;;


방식은 위의 도형과 같이 XML 과 DB 중간에 DataSet이란게 들어갑니다. (다른 방식이 있다면 알려주세요ㅠ) 
 
- 여기서 DataSet은 ADO.NET의 핵심적인 클래스로서 분산환경을 지원하기 위한 클래스라고 합니다.그리고 관련 테이블, 제약조건, 테이블간 관계 등의 완전한 데이터 집합의 구조를 가지고 있다고 합니다. 
 - .NET에서의 핵심적인 기술 분야가 XML입니다. 데이터 셋은 내부적으로는 XML과 호환되는 형식을 취하고 있습니다. 관점에 따라서는 데이터 셋 자체를 하나의 완전한 XML문서로 볼 수 있습니다. 그리고 외부의 XML문서를 가져와서 데이터 셋으로 변경하여 활용할 수도 있습니다. 데이터와 스키마를 XML문서로 읽고 쓸 수 있습니다.
 따라서 지금부터 DataSet과 XML을 가지고 놀아보겠습니다.


먼저 DB에 있는걸 XML 문서로 만드는 소스입니다.

밑에 있는 소스는 DB에 있는 테이블을 읽어와 DataSet에 넣는 작업입니다.
 private void button1_Click(object sender, EventArgs e)   //DB테이블 -> DataSet으로 
{

       String cstr = "server = 504-88\\SQL2005;database=master;";

       cstr += "uid=seol;password=1;";

 

       SqlConnection scon = new SqlConnection(cstr);

 

       SqlCommand scom = new SqlCommand();

       scom.Connection = scon;

       scom.CommandText = "select * from fruits";

       scon.Open();

 

       SqlDataReader sr;

       sr = scom.ExecuteReader();

 

       DataSet ds = new DataSet();

       DataTable dt = new DataTable("myTable");

 

       DataColumn dc = new DataColumn("number", typeof(int));

       dt.Columns.Add(dc);

       dc = new DataColumn("fname", typeof(string));

       dt.Columns.Add(dc);

 

       ds.Tables.Add(dt);

       DataRow row;

 

       while (sr.Read())

       {

           row = ds.Tables["myTable"].NewRow();

           row[0] = sr.GetValue(0);

           row[1] = sr.GetValue(1);

           ds.Tables["myTable"].Rows.Add(row);

       }

       Toss(ds);   //DataSet XML 파일 만드는 함수로 넘기기

       MessageBox.Show("XMl파일이 생성 되었습니다");

 
      scon.Close();

} 


그 다음은 DataSet을 Toss 함수로 넘겨줘서 XML 파일로 작성하는 코드입니다. (Toss는 제가 임의로 만든 함수)
 

private void Toss(DataSet ds) //XML파일로 만들기

{

      //XML Schema와 자료를 FileStream을 이용해서 파일에 기록하기

      SaveFileDialog save = new SaveFileDialog();

      save.Filter = "xml file (*.*)|*.*"; //파일 필터링

      save.ShowDialog();  //다이얼로그 박스 띄우기

      //filestream 생성

      System.IO.FileStream fsWriteXml = new System.IO.FileStream 
      (save.FileName, System.IO.FileMode.Create);

 

      //파일에 기록하기 위한 XmlTextWriter 생성

      System.Xml.XmlTextWriter xmlWriter = new System.Xml.XmlTextWriter

      (fsWriteXml, System.Text.Encoding.Unicode);

 

      //문서를 기록하기 위한 WriteXml 메서드 이용

      ds.WriteXml(xmlWriter);

 

      //FileStream 닫기

      fsWriteXml.Close();

 

      //original DataSet 정리

      ds.Dispose();

 

      //새로운 DataSet 생성

      DataSet newDataSet = new DataSet("New DataSet");

 

      //Read the XML document back in

 

      //FileStream 생성

      System.IO.FileStream fsReadXml = new System.IO.FileStream(save.FileName, System.IO.FileMode.Open);

 

      //파일을 읽기 위한 XmlTextRader 생성

      System.Xml.XmlTextReader myXmlReader = new System.Xml.XmlTextReader(fsReadXml);

 

      //DataSet 안으로 XML 문서 읽기

      newDataSet.ReadXml(myXmlReader);

 

      //XmlTextReader 닫기

      myXmlReader.Close();

}


여기까지가 DB -> XML 파일 만드는 코드입니다.
지금부터는 XML -> DB로 옮기는 코드입니다. 이 코드는 아는 동생과 함께 해봤습니다. 여러가지 방법이 있는 것 같아, 저는 Adapter를 이용해서 해보려고 했지만..실패했습니다 ㅠㅠ SqlParameter로 하니 금방 해결되더군요 -.-;;;
(다른 방법을 알고 계시면 꼭 댓글달아주시길 바래요!! 알고 싶습니다!!)

 

private void button2_Click(object sender, EventArgs e)  //xml -> DB 테이블로 넣기!!

{

     OpenFileDialog open = new OpenFileDialog();

     open.Filter = "xml file (*.*)|*.*"; //파일 필터링
    
open.ShowDialog();  //다이얼로그 박스 띄우기

      /* -----------------------------------------------------------------*/

 

     String cstr = "server = 504-88\\SQL2005;database=master;";

     cstr += "uid=seol;password=1;";

 

     string quey = "insert fruits (number, fname) values (@number,@fname)";

 

     SqlConnection scon = new SqlConnection(cstr);

     SqlCommand scom = new SqlCommand();

 

     scom.Connection = scon;

     scom.CommandType = CommandType.Text;

     scom.CommandText = quey;

 

     SqlParameter sparam1 = new SqlParameter("@number", SqlDbType.TinyInt);

     SqlParameter sparam2 = new SqlParameter("@fname", SqlDbType.VarChar, 50);

 

     DataSet ds = new DataSet("myTable");

     ds.ReadXml(open.FileName);  //xml파일 가져오기..

 

     scom.Parameters.Add(sparam1);

     scom.Parameters.Add(sparam2);

           

     scom.Connection.Open();

 

     foreach (DataTable table in ds.Tables)

     {

        foreach (DataRow row in table.Rows)

        {

             sparam1.Value = int.Parse(row["number"].ToString());

             sparam2.Value = row["fname"].ToString();

             scom.ExecuteNonQuery();

         }

     }

     scon.Close();

 }


 

p.s 방법이 많이 허접합니다. 다른 방법이 있다면 알려주세요!

'programming > XML' 카테고리의 다른 글

XML DOM(문서 개체 모델)  (0) 2010.07.29
XML <--> DB 연동!! 이번에는 IMAGE 주고받기.  (0) 2010.07.06
XMLWriter 클래스  (0) 2010.06.22
XML Reader 클래스  (0) 2010.06.21
네임스페이스와 Prefix  (0) 2010.06.21