使用ADO处理MS Access中的附件类型字段

时间:2014-11-16 15:56:03

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

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

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

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

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

您能否提供一个小代码片段,说明使用ADO在数据库中插入/加载此类数据?

谢谢。

1 个答案:

答案 0 :(得分:5)

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

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

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

由于您不会将Access UI用于您的应用程序

  1. 您将无法使用附件字段提供的许多优势,并且
  2. 您仍然可以通过您的C ++应用程序中的ACE DAO操作附件字段,但这会令人讨厌。
  3. 不使用Field1.FileName字段可能会遗漏的一个(可能)显着优势是Access数据库引擎自动压缩Attachment字段中的文件,但{{1}中的原始二进制数据字段未压缩存储。如果您要保存的文件无论如何都是压缩格式(例如,JPEG,.docx,.xlsx),那么这不是问题。但是,如果您计划以未压缩格式(例如.txt,.rtf)存储大量大型文档,那么文件膨胀可能是个问题。在这种情况下,您可以让C ++应用程序自动压缩这些文档(可能使用GZipStream),然后保存它们并在检索时解压缩它们。