시나리오.
일단, 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 |