2015-12-18 76 views
4

由於某種原因,當我嘗試更新用戶的圖像時,我的代碼失敗。圖像未正確保存。例如,38千字節的圖像在數據庫中保存爲13個字節。C#將圖像保存爲MySql數據庫blob

這是我的代碼:

public void UploadImage(Image img) 
    { 
     OpenConnection(); 
     MySqlCommand command = new MySqlCommand("", conn); 
     command.CommandText = "UPDATE User SET UserImage = '@UserImage' WHERE UserID = '" + UserID.globalUserID + "';"; 
     byte[] data = imageToByte(img); 
     MySqlParameter blob = new MySqlParameter("@UserImage", MySqlDbType.Blob, data.Length); 
     blob.Value = data; 

     command.Parameters.Add(blob); 

     command.ExecuteNonQuery(); 
     CloseConnection(); 
    } 

    public byte[] imageToByte(Image img) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
      return ms.ToArray(); 
     } 
    } 

OpenConnection的和closeconnection只是conn.Open()和conn.Close()。

轉換但是不會失敗:enter image description here

但在數據庫中,我看到:enter image description here

有沒有人有任何想法是怎麼回事?

+1

你的問題是'UserImage ='@ UserImage',用'UserImage = @ UserImage'或者更常規的'UserImage =?UserImage'取代它,它會起作用。你發送一個字符串,因此有10個字節。 – bokibeg

+0

只是一個側面說明,但你確定你想保存爲一個blob。 http://stackoverflow.com/questions/1347461/saving-images-files-or-blobs –

回答

2

替換此代碼:

OpenConnection(); 
MySqlCommand command = new MySqlCommand("", conn); 
command.CommandText = "UPDATE User SET UserImage = '@UserImage' WHERE UserID = '" + UserID.globalUserID + "';"; 
byte[] data = imageToByte(img); 
MySqlParameter blob = new MySqlParameter("@UserImage", MySqlDbType.Blob, data.Length); 
blob.Value = data; 

command.Parameters.Add(blob); 

command.ExecuteNonQuery(); 
CloseConnection(); 

隨着

var userImage = imageToByte(img); 

OpenConnection(); 

var command = new MySqlCommand("", conn); 

command.CommandText = "UPDATE User SET UserImage = @userImage WHERE UserID = @userId;"; 

var paramUserImage = new MySqlParameter("@userImage", MySqlDbType.Blob, userImage.Length); 
var paramUserId = new MySqlParameter("@userId", MySqlDbType.VarChar, 256); 

paramUserImage.Value = userImage; 
paramUserId.Value = UserID.globalUserID;  

command.Parameters.Add(paramUserImage); 
command.Parameters.Add(paramUserId); 

command.ExecuteNonQuery(); 

CloseConnection(); 

你被髮送'@UserImage'這是一個10字節長的字符串,刪除引號,它應該工作。

上面的代碼也使用參數爲您的兩個變量which you should always do

無論哪種方式希望這可以幫助你。

+1

工作就像一個魅力,謝謝 – Thodor12

1

起初,我想保存的斑點在數據庫好的:)

如果你傳遞一個參數,不要將其封裝在',因爲比ADO.Net/MySql不會承認它作爲一個參數,而不是字符串:

command.CommandText = "UPDATE User SET UserImage = @UserImage WHERE UserID = '" + UserID.globalUserID + "';"; 

如果你開始使用參數,爲什麼不通過UserID也作爲一個參數:

command.CommandText = "UPDATE User SET UserImage = @UserImage WHERE UserID = @userId;"; 

竟被這讓每一個想法都更清晰。

一件重要的事情是:如果你在數據庫中存儲斑點,千萬不要使用select * from ...,因爲通常你不想檢索斑點,但你會與明星。這會導致不必要的流量並降低性能。

希望這會有所幫助!

相關問題