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。 这会导致不必要的交通并降低性能。
希望这可以帮助!