數據庫中用varbinary存儲二進制數據


問題描述:將圖片、二進制文件內容等數據存儲在數據庫中,並能從數據庫中取出還原為圖片或文件,數據庫存儲二進制數據用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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM