2010年12月2日 星期四

[C#] 將二進位資料寫入資料庫

這兩天在研究如何對資料庫操作二進位的資料
最基本的應用就是把圖片存進資料庫,而不是只存圖片路徑
以撰寫應用程式的層面來看
大致上就是
1.「將已存在於電腦上的圖片讀入pictureBox」
2.「將該圖片寫入資料庫」
3.「從資料庫讀出圖片至pictureBox」
這三個主要的動作
在Access上是使用OLE物件為該圖片欄位的資料型態
而Oracle則是Blob

第一個算是控制項操作基礎也沒啥好講的了
2跟3倒是費了我不少時間,尤其是在Oracle方 Orz
圖片寫入資料庫的流程概念:
1.將圖片轉存為記憶體串流
2.將記憶體串流轉為byte陣列
(此步驟是因為有一些特別的圖片格式無法直接轉成byte陣列)
3.將byte陣列寫入資料庫

從資料庫讀出圖片就是反向:
1.從資料庫將圖片讀出存放在byte陣列
2.將byte陣列轉換為記憶體串流
3.把記憶體串流做為pictureBox的顯示圖片

再來就來看看實做的Code吧
假設今天Access資料庫為test.mdb,img資料表
有兩個欄位,id與pics
先看寫入資料庫的部份
MemoryStream st = new MemoryStream();
pBox.Image.Save(st, pBox.Image.RawFormat);
byte[] by = st.ToArray();
string strDbConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\test.mdb";
OleDbConnection OdbConn = new OleDbConnection(strDbConn);
OdbConn.Open();
OleDbCommand OdbCmd = new OleDbCommand("update img set pics = ? where id = 1", OdbConn);
OleDbParameter parameter = new OleDbParameter("pics", System.Data.OleDb.OleDbType.Binary);
parameter.Size = by.Length;
parameter.Value = by;
OdbCmd.Parameters.Add(parameter);
OdbCmd.ExecuteNonQuery();
OdbCmd.Dispose();
OdbConn.Close();
OdbConn.Dispose();

再來是從資料庫讀出圖片
string strDbConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\test.mdb";
OleDbConnection OdbConn = new OleDbConnection(strDbConn);
OdbConn.Open();
OleDbCommand OdbCmd = new OleDbCommand("select pics from img where id = 1", OdbConn);
byte[] by = (byte[])OdbCmd.ExecuteScalar();
MemoryStream st = new MemoryStream(by, 0, by.Length);
pBox.Image = Image.FromStream(st);
OdbCmd.Dispose();
OdbConn.Close();
OdbConn.Dispose();

Oracle的部份雖然有實作成功
不過跟我所找到的一些國外的文件在做法上有差異
等我把他搞清楚整個機制再來po

沒有留言:

張貼留言