C#将图像保存为Mybql数据库为blob

出于某种原因,当我尝试为用户更新图像时,我的代码失败了。 图像未正确保存。 例如,38 kib的图像在数据库中保存为13个字节。

这是我的代码:

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()。

但转换不会失败: 在此处输入图像描述

但是在数据库中我看到了这个: 在此处输入图像描述

有谁知道这里发生了什么?

替换此代码:

 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字节长的字符串,删除引号,它应该工作。

上面的代码也使用了你应该经常做的两个变量的参数。

无论哪种方式希望这对你有帮助。

起初,我喜欢在数据库中保存blob好一个:)

如果传递参数,请不要将其封装在' ,因为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;"; 

这会让每个人都更加清晰。

一件重要的事情:如果您将blob存储在数据库中,请不要使用select * from ... ,因为通常您不想检索blob,但是您将使用star。 这会导致不必要的交通并降低性能。

希望这可以帮助!