【问题标题】:SqlDataReader: Read varbinary into byte arraySqlDataReader:将 varbinary 读入字节数组
【发布时间】: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 imagebyte[]。刚刚将其添加到我的问题以及我收到的错误消息中。
  • 能否复制完整的错误。我确信它提供了比这更多的细节
  • @Nkosi 对不起!完全忘记上传图片了-.-

标签: c# sqldatareader varbinary varbinarymax


【解决方案1】:

将 varbinary(MAX) 转换为字节数组后

image = (byte[])dr[24];

试试这个..

    MemoryStream ms = new MemoryStream(image);
    imagePictureBox.Image = System.Drawing.Image.FromStream(ms);

这就是我创建字节数组的方式...

    if (File.Exists(sLogoName) == false)
       throw new Exception("File Not Found: " + sLogoName);
    FileStream sourceStream = new FileStream(sLogoName, FileMode.Open, FileAccess.Read);
    int streamLength = (int)sourceStream.Length;
    Byte[] byLogo = new Byte[streamLength];
    sourceStream.Read(byLogo, 0, streamLength);
    sourceStream.Close();

【讨论】:

  • 非常感谢!问题不在于我如何尝试从数据库中加载图像,而在于我如何存储它。使用您提供的代码来编写字节数组,我现在可以加载图像。太棒了:)
  • 很高兴能奏效...我最初遇到了问题。
猜你喜欢
  • 2018-11-14
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2014-09-21
  • 2012-04-14
  • 1970-01-01
相关资源
最近更新 更多