【发布时间】:2018-12-16 06:04:44
【问题描述】:
我有一个带有 varbinary(max) 列的 SQL Server 表。我用它来存储图像。图片是用OpenFileDialog 选择的,像这样翻译成byte[]
public byte[] ConvertImageToByteArray(String filepath)
{
try
{
return File.ReadAllBytes(filepath);
}
catch (Exception)
{
throw;
}
}
然后使用这行代码存入数据库:
sqlCmd.Parameters.Add("@image", SqlDbType.VarBinary).Value = image;
它看起来像这个存储在数据库中,所以我想一切似乎都像预期的那样工作。
很遗憾,我无法从数据表中加载图像。
我正在使用SqlDataReader 这样做:
DbSql db = new DbSql();
SqlDataReader dr = db.GetDataReader(sqlCmd);
if (dr.Read())
{
if (!dr.IsDBNull(1))
productName = dr.GetString(1);
if (!dr.IsDBNull(2))
identNumber = dr.GetString(2);
[...]
if (!dr.IsDBNull(23))
comment = dr.GetString(23);
if (!dr.IsDBNull(24))
{
byte[] image = dr.GetSqlBytes(24).Value; // <- This is where I try to grab the image
}
}
似乎我无法使用
创建正确的byte[]
image = dr.GetSqlBytes(24).Value;
因为我下一步无法再次将其变成图像:
public Image ConvertImageFromByteArray(byte[] array)
{
try
{
MemoryStream ms = new MemoryStream(array);
return Image.FromStream(ms);
}
catch (Exception) { throw; }
}
编辑:
当尝试类似
pictureBox.Image = ConvertImageFromByteArray(image)
我收到一条错误消息,提示“无效参数”(自我翻译,德语中的“Ungültiger Parameter”)
谁能提供解决方案?
【问题讨论】:
-
试试
image = (byte[])dr[24]; -
为什么要使用 GetString 读取数据,这会损坏数据。 dr.Read() 读取包含整个二进制对象的数据库的一行。所以只需使用: MemoryStream ms = new MemoryStream((byte[])dr.GetValue(23));它将读取第 24 列的内容。
-
@Nkosi
image是byte[]。刚刚将其添加到我的问题以及我收到的错误消息中。 -
能否复制完整的错误。我确信它提供了比这更多的细节
-
@Nkosi 对不起!完全忘记上传图片了-.-
标签: c# sqldatareader varbinary varbinarymax