从 .NET 中的 MS Access 数据库读取 OLE 图像时出现 ArgumentException

Posted

技术标签:

【中文标题】从 .NET 中的 MS Access 数据库读取 OLE 图像时出现 ArgumentException【英文标题】:ArgumentException on reading an OLE image from an MS Access database in .NET 【发布时间】: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。我认为这是第一种选择。您如何将图像保存到数据库中? 【参考方案1】:

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

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

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

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

【讨论】:

能否请您点击此链接:***.com/questions/32528427/…

以上是关于从 .NET 中的 MS Access 数据库读取 OLE 图像时出现 ArgumentException的主要内容,如果未能解决你的问题,请参考以下文章

从 MS Access 批量导入并插入 Sql Server [关闭]

从 C# WPF 应用程序中读取 MS Access 数据库中的图像 [重复]

如何从 SQL Server 读取 MS Access 数据库以更新一个或多个表列中的数据?

初始化使用 .NET 从 MS Access 数据库导入的 ILOG OPL 中的元组

从 C#.NET 应用程序调用 MS Access 中的 VBA 代码

MS Access VBA从Web浏览器控件的内容中获取数据