我正在使用SQLCe数据库开发一个winform C#应用程序。
当我上传图片(并将其显示到PictureBox)时
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Image Files(*.jpg; *.jpeg; *.bmp)|*.jpg; *.jpeg; *.bmp";
if (open.ShowDialog() == DialogResult.OK)
{
imageArray = System.IO.File.ReadAllBytes(@"" + open.FileName);
using (MemoryStream ms = new MemoryStream(imageArray))
{
ms.Write(imageArray, 0, imageArray.Length);
ms.Seek(0, SeekOrigin.Begin);
companyLogoPB.Image = Image.FromStream(ms);
}
}
完美无缺 - 字节数组转换为图像并显示在PictureBox上。
这是我将其更新到数据库中的方法(完美运行):
string query = "UPDATE Company SET Logo=@Logo;";
SqlCeCommand cmd = new SqlCeCommand(query, con);
cmd.Parameters.AddWithValue("Logo", SqlDbType.Image).Value = imageArray;
int affectedRow = cmd.ExecuteNonQuery();
但是,当我从数据库中检索此数据时:
private void getImageBytes()
{
DataTable dt = new DataTable();
string query = "SELECT LOGO FROM ECompany;";
SqlCeDataAdapter da = new SqlCeDataAdapter(query, con);
da.Fill(dt);
return Encoding.ASCII.GetBytes(dt.Rows[0][0].ToString());
}
//snippet where error occurs:
using (MemoryStream ms = new MemoryStream(imageArray))
{
ms.Write(imageArray, 0, imageArray.Length);
ms.Seek(0, SeekOrigin.Begin);
companyLogoPB.Image = Image.FromStream(ms); //ERROR
}
我收到错误:参数无效。我的猜测是返回的字节不是以相同的格式编码的。任何想法我应该如何检索存储的图像byte [](哪个有效)?
答案 0 :(得分:0)
这是问题所在:
return Encoding.ASCII.GetBytes(dt.Rows[0][0].ToString());
您正在将值转换为字符串。这不是文本数据 - 只是不要这样做!
我期待您能够将值转换为byte[]
:
return (byte[]) dt.Rows[0][0];
另请注意,当您加载图片时,您最好还是选择:
companyLogoPB.Image = Image.FromStream(new MemoryStream(byteArray));
这是更简单的代码(你不需要编写字节数组然后搜索)并且它更有可能工作 - 当你使用Image.FromStream
,它接管流的所有权,所以你< em>不应该自己处理它。