以相同的格式检索先前存储的字节数组c#

本文关键字:字节 存储 字节数 数组 格式 检索 | 更新日期: 2023-09-27 17:54:57

我正在开发一个使用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
}

我得到一个错误:参数无效。我的猜测是返回的字节没有以相同的格式编码。任何想法我应该如何检索存储的图像字节[](工作)?

以相同的格式检索先前存储的字节数组c#

这就是问题所在:

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,接管流的所有权,所以你不应该处置它自己。