2012-04-13 204 views
1

我必須存儲和恢復圖像到/從MySQL數據庫。爲此,我使用此頁上提供的說明:MySQL Forum,我可以通過下面的代碼成功存儲圖片:從MySQL數據庫獲取圖像 - C#

SaveIamge:

void SaveImage() 
    { 
     MemoryStream ms = new MemoryStream(); 
     pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
     cmd = new MySqlCommand("INSERT INTO " + tableName + " (Product, Manufacturer, Description, Price, Image) Values ('New_Product', 'New_Manufacturer', 'New_Description', '0', @Image)", conn); 
     cmd.Parameters.Add(new MySqlParameter("@Image", Convert.ToBase64String(ms.ToArray()))); 
     cmd.ExecuteNonQuery(); 
    } 

但我不能獲取從數據庫中的圖像:我現在用下面的代碼,請檢查什麼是錯在這裏:

GetThumbnail:

 void GetThumbnail() 
    { 
     string TN = tableNames[comboBox1.SelectedIndex]; 
     cmd = new MySqlCommand("SELECT Image FROM " + tableName + " WHERE Product = " + ProductTitle(), conn); 
     object imgObj = cmd.ExecuteScalar(); 
     byte[] b = Convert.FromBase64String(Convert.ToString(imgObj)); 
     MemoryStream ms = new MemoryStream(b); 
     pictureBox2.Image = Image.FromStream(ms); 
    } 
+0

可以調試,看看'imgObj'是得到什麼? – 2012-04-13 16:48:03

回答

5

如何將圖像存儲到二進制字段?這將使比的Base64更有意義對其進行編碼:

void SaveImage(byte[] image) 
{ 
    using (var conn = new MySqlConnection(ConnectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = "INSERT INTO pictures (Product, Manufacturer, Description, Price, Image) VALUES ('New_Product', 'New_Manufacturer', 'New_Description', '0', ?Image)"; 
     cmd.Parameters.Add("?Image", image); 
     cmd.ExecuteNonQuery();  
    } 
} 

byte[] GetImage(string product) 
{ 
    using (var conn = new MySqlConnection(ConnectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = "SELECT Image FROM pictures WHERE Product = ?product"; 
     cmd.Parameters.Add("?product", product); 
     using (var reader = cmd.ExecuteReader()) 
     { 
      if (!reader.Read()) 
      { 
       return null; 
      } 

      const int CHUNK_SIZE = 2 * 1024; 
      byte[] buffer = new byte[CHUNK_SIZE]; 
      long bytesRead; 
      long fieldOffset = 0; 
      using (var stream = new MemoryStream()) 
      { 
       while ((bytesRead = reader.GetBytes(reader.GetOrdinal("Image"), fieldOffset, buffer, 0, buffer.Length)) > 0) 
       { 
        stream.Write(buffer, 0, (int)bytesRead); 
        fieldOffset += bytesRead; 
       } 
       return stream.ToArray(); 
      } 
     } 
    } 
} 

然後:

using (var ms = new MemoryStream()) 
{ 
    pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
    SaveImage(ms.ToArray()); 
} 

,當你想要檢索:

byte[] image = GetImage("New_Product"); 
MemoryStream stream = new MemoryStream(image); 
pictureBox2.Image = Image.FromStream(ms); 
+0

我試過你的代碼,但它仍然無法正常工作。 – 2012-04-14 11:47:22

+0

如果我替換此線'而它僅工作((bytesRead = reader.GetBytes(reader.GetOrdinal( 「圖像」),fieldOffset,緩衝液,0,buffer.Length))> 0)'與此'而((bytesRead = reader.GetBytes(reader.GetOrdinal( 「圖像」),fieldOffset,緩衝液,0,buffer.Length))== buffer.Length)' – 2016-10-08 20:07:43