从 .Net 访问 Microsoft Access 2003 和 2007 BLOB 字段

Posted

技术标签:

【中文标题】从 .Net 访问 Microsoft Access 2003 和 2007 BLOB 字段【英文标题】:Accessing Microsoft Access 2003 and 2007 BLOB fields from .Net 【发布时间】:2010-05-24 05:21:10 【问题描述】:

我需要能够从 Access 2003 和 Access 2007 中提取 BLOB。Access 2003 将 BLOB 存储为“OLE 对象”,而 Access 2007 为您提供了另一个选项“附件”。主要区别在于可以将多个附件添加到一行,而每个“OLE 对象”数据类型只能有一个 BLOB。

我必须能够在不使用互操作的情况下执行此操作,因为我无法强制安装 Office 的依赖关系。这让我只能选择 DAO 或 ADO。因此,我编写了代码以使用这两种技术将 BLOB 从测试数据库中提取出来,并嵌入了不同类型的文件类型。

我遇到的问题是,似乎 Access 将嵌入文件包装在某种类型的元数据中。最终结果是,文件一旦被提取,就不再相同,并且无法被关联的应用程序打开,因为它“已损坏”。 Access 将原始文件名等内容存储在此元数据中。我需要能够从文件中剥离元数据以使文件处于其原始状态。

有没有一些黑暗的巫术可以做到这一点?关于这个主题的文档很少。任何帮助将不胜感激。

提前致谢。

【问题讨论】:

当你说 ADO 时,你的意思是 ADODB.Stream 吗? 在 Jet/ACE 中,BLOB 和 OLE 字段是两种不同的数据类型。前者是一个纯二进制字段,可以根据需要在其中存储任意数据。另一方面,OLE 字段具有围绕二进制内容的标准包装器,用于控制嵌入其中的对象的打开和操作方式。 我不确定您是否可以在没有自动化的情况下完成您需要做的事情。您看过 Stephen Lebans 的 OLE 提取实用程序吗? lebans.com/oletodisk.htm -- 该数据库中的代码可能会给你一些关于它是如何在 Access 中完成的想法,因此可能会给你一些线索,让你知道在没有自动化的情况下(或不自动化)什么是可能的。 感谢 OleToDisk 的提示。我会看看,看看我能想出什么。除此之外,我还发现了一些描述根据文件类型从字节数组中剥离前 X 个字节的点点滴滴,这可能是我需要做的才能使其正常工作。问题是这就像在黑暗中四处寻找,因为没有关于文件包装时实际发生的情况的规范。 我听到了。我有一个项目,我们将所有类型的文档(Word、Excel、Powerpoint)存储在 OLE 字段中,当需要迁移到不同的应用程序时,我们无法提取数据。那时大部分都已经过时了,所以他们没有打扰,但它证实了将文档存储在数据库中并不是一个好主意。 【参考方案1】:

这是因为 OLE 对象在 Access 上像“图像”一样存储。这会导致性能问题,也会导致像您这样的问题。为了解决这些限制,微软在 Access 2007/2010 上引入了附件字段,它不需要 OLE 服务器来运行内容。附件,每条记录应该有一个以上的文件,由 MS-Access 在后台自动管理。也许你应该使用附件或为 SQL Server、MY-SQL、Firebird 更改数据库。

【讨论】:

以上是关于从 .Net 访问 Microsoft Access 2003 和 2007 BLOB 字段的主要内容,如果未能解决你的问题,请参考以下文章

Nuxt acces vuex store inside mixin

将访问权限迁移到 ASP.NET

Microsoft.Net.Http 与 Microsoft.AspNet.WebApi.Client

glassfish 3错误404

从 Flex 3 安全地访问 .NET Web 服务

从 JQuery 访问文本框