XML 문서 구조에서 이 그림의 각 원은 XmlNode 개체라고 하는 노드를 나타냅니다. XmlNode 개체는 DOM 트리에서 기본 개체입니다. XmlNode를 확장한 XmlDocument 클래스는 XML을 메모리에 로드하거나 파일로 저장하는 것처럼 문서 전체에 수행되는 메서드를 지원합니다. 또한 XmlDocument를 통해 전체 XML 문서의 노드를 보고 조작할 수도 있습니다. XmlNodeXmlDocument에서는 모두 성능과 가용성이 향상되었고 다음 기능을 수행하는 메서드 및 속성을 제공합니다.


출처: MSDN

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

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



시나리오.

 일단, DB 테이블에 이미지를 넣어두었다.  그리고 그 이미지를 불러와 XML 파일에 저장한다. 또, 반대로 XML에 저장해두었던 이미지를 DB 테이블에 저장하였다.

 밑에 소스는 DB에 있는 이미지를 DataSet에 담는 소스입니다. 그리고 Toss함수를 이용해 xml파일로 만듭니다.

private void button3_Click(object sender, EventArgs e)   //image -> xml!!

{

       byte[] MyData = null;    //byte배열 선언..

     

       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 Image_Table";

       scon.Open();

 

       SqlDataReader dr = scom.ExecuteReader();

 

       SqlDataAdapter da = new SqlDataAdapter("select * from Image_Table", scon);

       SqlCommandBuilder sb = new SqlCommandBuilder(da);

 

       DataSet ds = new DataSet();

       DataTable dt = new DataTable("myTable");

 

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

       dt.Columns.Add(dc);

       dc = new DataColumn("Crop_Image", typeof(byte[])); //타입선언이 중요!!

       dt.Columns.Add(dc);

       ds.Tables.Add(dt);

 

       DataRow row;

   

       while (dr.Read())

       {

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

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

            MyData = (byte[])dr.GetValue(1);   //byte배열에 담아줍니다.

            row[1] = MyData;                     //담아준걸 row에 넣어주어야 겠죠~

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

       }

       dr.Close();

       scon.Close();

       Toss(ds); // XML 파일 만드는 함수

}


Toss함수입니다. 설명은 전 글에 있습니다. 

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

{

       SaveFileDialog save = new SaveFileDialog();

       save.Filter = "xml file (*.*)|*.*";

       save.ShowDialog();

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

       System.Xml.XmlTextWriter xmlWriter = new System.Xml.XmlTextWriter(fsWriteXml, System.Text.Encoding.Unicode);

       ds.WriteXml(xmlWriter);

       fsWriteXml.Close();

       ds.Dispose();

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

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

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

       newDataSet.ReadXml(myXmlReader);

       myXmlReader.Close();

}


여기까지가 DB의 이미지 데이터를 XML로 만다는 소스입니다 .
지금부터는 반대로 XML -> DB 테이블에 담아보겠습니다.

xml의 데이터를 읽어주고, 이미지를담아주는 함수입니다. 요넘이 중요한 역할을 합니다.

public static byte[] GetPhoto(string filepath)   //이미지 저장 함수.

{

     FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read);

     BinaryReader reader = new BinaryReader(stream);

 

     byte[] photo = reader.ReadBytes((int)stream.Length);

     reader.Close();

     stream.Close();

     return photo;

}


이게 xml -> DB로 담아주는 소스입니다 

private void button4_Click(object sender, EventArgs e)

{

     OpenFileDialog open = new OpenFileDialog();

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

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

 

     byte[] photo = GetPhoto(open.FileName); //이미지를 저장하기 위한 함수

 

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

 

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

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

 

     string query = "insert Image (Crop, Crop_Image) values (@Crop_n,@Crop_Image_n)";

 

     DataSet ds = new DataSet("myTable");

 

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

 

     SqlConnection scon = new SqlConnection(cstr);

     SqlCommand scom = new SqlCommand();

 

     scom.Connection = scon;

     scom.CommandType = CommandType.Text;

     scom.CommandText = query;

 

     SqlParameter sparam1 = new SqlParameter("@Crop_n", SqlDbType.VarChar, 250);

     SqlParameter sparam2 = new SqlParameter("@Crop_Image_n", SqlDbType.Image, photo.Length);

 

     com.Parameters.Add(sparam1);

     scom.Parameters.Add(sparam2);

 

     scom.Connection.Open();

 

     foreach (DataTable table in ds.Tables)

     {

         foreach (DataRow row in table.Rows)

         {

             sparam1.Value = row[0].ToString();

             sparam2.Value = photo; //보시다시피 photo를 파라미터 value 값으로 넘김

             scom.ExecuteNonQuery();

         }

     }

     scon.Close();

}



간단합니다. 중간 중간 adapter 를 사용해서 쓰이는 방법도 있습니다 (fill을 이용해서요~)

아직 부족한 프로그래밍을 배우는  학생입니다^^ 더 쉬운 방법이 있거나, 잘못된 점이 있다면 지적해주세요!!

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

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

  지금 해보고자 하는 것은 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
XML과 DB와의 연동 (xml <->DataSet <-> DB Table)  (2) 2010.06.30
XMLWriter 클래스  (0) 2010.06.22
XML Reader 클래스  (0) 2010.06.21
네임스페이스와 Prefix  (0) 2010.06.21
  1. Favicon of http://redsea23.tistory.com BlogIcon 노을지기 2011.04.01 03:57 신고

    좋은 자료 감사합니다.
    퍼가도 될까요?

+ Recent posts