출처: http://seolis.tistory.com/entry/XML%EA%B3%BC-DB%EC%99%80%EC%9D%98-%EC%97%B0%EB%8F%99-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 방법이 많이 허접합니다. 다른 방법이 있다면 알려주세요!


Posted by 노을지기