본문 바로가기

programming/XML

XML <--> DB 연동!! 이번에는 IMAGE 주고받기.



시나리오.

 일단, 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와의 연동 (xml <->DataSet <-> DB Table)  (2) 2010.06.30
XMLWriter 클래스  (0) 2010.06.22
XML Reader 클래스  (0) 2010.06.21
네임스페이스와 Prefix  (0) 2010.06.21