【问题标题】:ArgumentException on reading an OLE image from an MS Access database in .NET从 .NET 中的 MS Access 数据库读取 OLE 图像时出现 ArgumentException
【发布时间】:2015-09-10 17:23:22
【问题描述】:

我正在尝试从 Access 数据库中读取图像。它读取字节,但当我尝试使用Image.FromStream 时,它给出了未处理的 System.ArgumentException。

这是我的代码:

 private Image ReadImageFromDB()
    {
        Image fetchedImg;
        if (rownumber >= 0)
        {
            byte[] fetchedimgbytes = (byte[])localDataTable.Rows[5]["Object"];
            MemoryStream stream = new MemoryStream(fetchedimgbytes);
           fetchedImg= Image.FromStream(stream);
            return fetchedImg;
        }
        else
        {
            MessageBox.Show("no image");
            return null;
        }
    }

【问题讨论】:

  • 您如何与我们分享例外情况。它肯定会帮助我们调试。现在它可以是任何东西,Rows[5] 可能不存在。 fetchedimgbytes 可能为空,stream 可能不代表图像。你并没有真正让我们继续前进。
  • 您在哪一行得到未处理的异常?你用什么连接到数据库?你如何填充结果集?
  • System.Drawing.dll中发生的异常类型为'System.ArgumentException'
  • 如果它是位图图像,我如何从数据库中读取它
  • MSDN 说,当“流没有有效的图像格式”或“流”为空时,会引发 FromStream 方法的 ArgumentException。我认为这是第一种选择。您如何将图像保存到数据库中?

标签: c# ms-access ole


【解决方案1】:

我下载了您的示例文件,当我在 Access 中打开表格时,[Img] 列中的项目显示“位图图像”,而不是“长二进制数据”。

因此,该行中的 [Img] 项是“OLE 包装”对象,而不是原始位图图像。如果您提取该列的二进制内容(就像您从 C# 应用程序中所做的那样),它将包含原始二进制图像数据周围的 OLE 包装器,并且不会是该格式的有效位图图像。

您需要从二进制数据中删除 OLE 标头信息,然后才能将其识别为有效图像。有关如何执行此操作的信息,请参阅此问题:

Convert Access image OLE Object into raw image byte array in C#

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 2011-01-25
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多