【问题标题】:Handling fields of Attachment type in MS Access using ADO使用 ADO 在 MS Access 中处理附件类型的字段
【发布时间】:2014-11-16 15:56:03
【问题描述】:

我的数据库中有一些字段需要存储图像(位图、JPG 或 PNG)和 PDF(或 Excel/RTF/TXT)文件。通过 Internet 浏览,我了解到 MS Access 2007(和更新版本)有一个类型为 Attachment 的字段可以满足我的需要。

但是,我通过 GUI 填充数据库(在 C++WinAPI 中制作),使用 ADO。我找不到使用ADO 将此类数据插入/加载到/从数据库中的示例。在这里搜索一些类似的问题(VB、Delphi、Python...),我发现我的方法可能不是最好的,但似乎可以做到。

由于缺乏经验,而且这是我第一次处理此类任务,我请求社区帮助我解决此任务。因此我的问题:

  • 我应该如何使用ADO 将此类数据(图像、文档...)插入/加载到 MS Access 2007(或更高版本)数据库中?

您能否提供小代码 sn-p 来说明如何使用 ADO 将此类数据插入/加载到数据库中?

谢谢。

【问题讨论】:

  • 您说您将“通过 GUI(用 C++ 制作)填充 [the] 数据库”,但 C++ 前端会是与数据库交互的唯一模式吗?或者,其他用户会是在 Access 本身(完整版或运行时)中打开数据库并使用 Access 表单和报告?
  • @GordThompson:C++ 前端会成为与数据库交互的唯一模式吗? 是的,最终用户没有编程背景。 其他用户是否会在 Access 本身(完整版或运行时)中打开数据库并使用 Access 表单和报告? 不,如果发生任何意外情况,我将不得不处理它。值得一提的是,用户希望将文档存储在数据库中。我无法将文件路径存储为字符串。目前我正在分析this example,因为它看起来很有希望。
  • @GordThompson:我记得你过去曾成功地帮助过我。如果我没记错的话,您使用VB 而不是C++。如果您不能以任何其他方式提供帮助,我会考虑VB 中的解决方案或伪代码...

标签: c++ winapi ms-access-2007 ado attachment-field


【解决方案1】:

如果您打算仅将 C++ 应用程序用作前端并且希望用户在 Access 本身中打开数据库,那么我建议您避免使用 Attachment 字段类型。相反,使用名为 [Attachments] 的单独子表,在 [Attachments] 表和父表(您正在考虑使用 Attachment 字段)之间具有一对多关系(外键约束)。然后,将文档作为原始二进制数据保存在子表的 OLE Object(长二进制)字段中。

Attachment 字段类型为使用 Access UI 的应用程序提供了多种优势。对单个数据库记录的多个附件的支持可以简单到将Attachment 控件放到Access 表单上。附件也可以从数据表视图中访问,尽管您看到的只是一个“回形针”图标。

可以通过代码操作附件字段,但只能使用 ACE DAO Recordset2 对象(例如 here)。为了能够为每条记录保存多个附件,Access 数据库引擎使用隐藏的子表。可以使用“魔术”字段名称限定符(例如,Field1.FileName)将一些信息提取到 SELECT 查询中,但 ADO 和 ODBC 都不能插入或更新附件字段条目。

因为您不会为您的应用程序使用 Access UI

  1. 您将无法使用附件字段必须提供的许多优势,并且
  2. 您仍然可以在 C++ 应用程序中通过 ACE DAO 操作“附件”字段,但这会很麻烦。

不使用Attachment 字段可能会错过的一个(可能)显着优势是Access 数据库引擎自动压缩Attachment 字段中的文件,但OLE Object 字段中的原始二进制数据未压缩存储.如果您打算保存的文件都是压缩格式(例如 JPEG、.docx、.xlsx),那么这不是问题。但是,如果您计划以未压缩格式(例如 .txt、.rtf)存储大量大型文档,那么文件膨胀可能会成为问题。在这种情况下,您可以让您的 C++ 应用程序在保存这些文档之前自动压缩这些文档(可能使用 GZipStream)并在检索时解压缩它们。

【讨论】:

  • 感谢您的回答。我没有使用 .NET,但会研究 WinAPI 来压缩文件(我想我之前发现了一些东西)。我会和我的上级谈谈,尝试建议他们使用应用程序目录中的一个文件夹,这样我就可以只存储文件名,然后将该文件复制到目录中。然后我可以使用ShellExecute打开文件,例如...至于通过C++将OLE对象插入Access,我应该从this示例开始吗?最好的问候。
  • @AlwaysLearningNewStuff 抱歉,我无法提供任何特定于 C++ 的建议。 (我回答的基础是您的应用程序不是 Access,而不是它 C++的事实。)我做了一些C#工作,但是C++太不一样了。
  • 我的问题快要解决了,因此正式接受您的回答。由于我坚信该问题与 MS Access 相关,因此请您帮助我解决 this 问题,特别是如何纠正 MS Access 报告的错误。谢谢你。最好的问候。
  • 自从我听取了您的建议并从Attachment 切换到OLE Object,我决定正式接受并支持您的回答。谢谢你。最好的问候,直到下一次。
猜你喜欢
  • 2016-12-09
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多