問題描述:將圖片、二進制文件內容等數據存儲在數據庫中,並能從數據庫中取出還原為圖片或文件,數據庫存儲二進制數據用varbinary字段。
分析:由於之前數據庫中沒有用過varbinary存儲數據,首先要把varbinary搞懂了,其次就是圖片類型與二進制類型之間的轉換,文件類型與二進制類型之間的轉換。
准備工作:
1.varbinary 與 binary的區別:
固定長度 (binary) 的或可變長度 (varbinary) 的 binary 數據類型。
binary [ ( n ) ]
固定長度的 n 個字節二進制數據。N 必須從 1 到 8,000。存儲空間大小為 n+4 字節。
varbinary [ ( n ) ]
n 個字節變長二進制數據。n 必須從 1 到 8,000。存儲空間大小為實際輸入數據長度 +4 個字節,而不是 n 個字節。輸入的數據長度可能為 0 字節。在 SQL-92 中 varbinary 的同義詞為 binary varying。
注釋:如果在數據定義或變量聲明語句中沒有指定 n,默認長度為 1。如果沒有用 CAST 函數指定 n,默認長度為 30。
2.由於使用了MVC結構,生成Model類的時候竟然不知道其對應類型,網上搜也沒有結果,首先用了一個System.Data.SqlTypes.SqlBytes,后來誤打誤撞才發現竟然就是byte[]類型。
實現示例:
//1.首先將圖片裝換成字節數組 Bitmap btm = new Bitmap("C:/Users/Desktop/1.jpg"); MemoryStream ms = new MemoryStream(); btm.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); byte[] bytes = ms.GetBuffer(); //byte[] bytes= ms.ToArray(); 這兩句都可以 ms.Close(); try{ //2.往數據庫里寫圖片數據 //先打開兩個類庫文件 SqlConnection con = new SqlConnection(); con.ConnectionString = "server=.;database=Test;uid=sa;pwd=123456"; con.Open(); SqlCommand com = new SqlCommand(); com.Connection = con; com.CommandType = CommandType.Text; com.CommandText = "insert into Map(Id,BitmapData) values(1,@photo)"; com.Parameters.AddWithValue("@photo", bytes); SqlDataReader dr = com.ExecuteReader();//執行SQL語句 dr.Close();//關閉執行 con.Close();//關閉數據庫 //3.從數據庫中取圖片數據並顯示 SqlConnection con = new SqlConnection(); con.ConnectionString = "server=.;database=Test;uid=sa;pwd=123456"; String sql = "select * from Map where Id=1"; SqlCommand cmd = new SqlCommand(sql, con); con.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.Read()){ if (!dr.IsDBNull(1))//防止照片字段為空 { System.Data.SqlTypes.SqlBytes dataBytes = dr.GetSqlBytes(1); Image imge= Image.FromStream(dataBytes.Stream);//顯示照片 pb.ImageLocation = null; pb.Image = null; pb.Image = imge; } } } con.Close();//關閉數據庫 } catch (Exception) { throw; }
上述為測試示例,沒有直接取byte[]類型,如果要轉化成byte[]類型,可以用如下方法:
byte[] b=dr.GetSqlBytes(1).Value;
byte[] b1 = dr.GetSqlBytes(1).Buffer;
