使用表单在 MS Access 数据库中存储 PDF
Posted
技术标签:
【中文标题】使用表单在 MS Access 数据库中存储 PDF【英文标题】:Storing PDFs in MS Access Database using Forms 【发布时间】:2009-05-13 16:18:21 【问题描述】:我需要使用表单将 PDF 文件存储在共享驱动器上的 Access 数据库中。我想出了如何在表格中执行此操作(使用 OLE 对象字段,然后只需拖放),但我想在具有保存按钮的表单上执行此操作。单击保存按钮会将文件(不仅仅是链接)存储在数据库中。关于如何做到这一点的任何想法?
编辑: 我使用的是 Access 2003,数据库将存储在共享驱动器上,所以我不确定链接到文件是否能解决问题。
【问题讨论】:
您确定要将 PDF 存储在 OLE 字段中吗?你没有说什么版本的 Access,但在 2007 年之前,这有很大的开销。除非有一些未提及的要求,否则最好将文件存储在文件系统中,并将路径/文件名放在数据表的文本字段中。 可以从共享驱动器访问该数据库。因此,据我了解,文件系统看起来会有所不同(基于用户将我们的共享映射到的驱动器)。这就是我们不使用链接的原因。如果我们可以避免这个限制,显然我想使用链接而不是直接存储文件。 这是一个旧线程,但我从不说马修对我的问题的回答。对此,我想说:不要使用映射驱动器,而是使用 UNC 路径,除非服务器名称更改或共享映射更改,否则它们将始终相同。如果发生上述任何一种情况,驱动器映射无论如何都会失效。 【参考方案1】:我们有几个数据库,其中包含成千上万的文档(pdf、doc、jpg...),完全没有问题。在 Access 中,我们使用以下代码将二进制对象上传到二进制字段:
Function LoadFileFromDisk(Bestand, Optional FileName As String = "")
Dim imgByte() As Byte
If FileName = "" Then FileName = strFileName
Open FileName For Binary Lock Read As #1
ReDim imgByte(1 To LOF(1))
Get #1, , imgByte
Close #1
If Not IsEmpty(imgByte) Then Bestand.Value = imgByte
End Function
在这种情况下,Bestand 是包含二进制数据的字段。 我们使用 MS SQL Server 作为后端,但同样适用于 Access 后端。
【讨论】:
@birger 感谢您的建议。我尝试实现此代码,但对 VBA 如此陌生,我终生无法弄清楚如何实现它。例如,您能否解释一下“#1”和 LOF 名称的含义? 打开了一个文件,并为其分配了一个编号 (#1)。 imgByte 是一个字节数组。该数组的大小设置为文件 1 的长度:LOF(1)。 GET 函数读取文件,并将其存储到 imgByte。此时,imgByte 是一个表示图像文件的字节数组。然后将 Bestand 字段值设置为此数组,瞧:文件存储在该字段中。 结束请注意:这不是将对象存储在 OLE 字段中,因为该方法不会将 OLE 包装添加到文件中。 +1,非常有趣。我想这样做可以避免大量的大小和处理开销,但会丢失一些功能(例如在表单中预览或就地编辑) OLE 开销不大。但是在 Access 2010 中就地编辑确实被破坏了,所以我很高兴我们不再使用它了!【参考方案2】:如果您使用相同的概念,但升级为 SQL Server,将 PDF 存储在 Image 数据类型(或 varbinary(max))中,那么您可以使用全文搜索在 PDF 中进行搜索。
我表明,Microsoft 表示您可以为任何可以注册 IFILTER 产品的文件类型执行此操作。前几天我刚刚在 Adobe 网站上说他们的 Acrobat IFILTER 确实是免费的。
【讨论】:
非常有趣!但我想这仅适用于存储为 OLE 的对象,而不是像 @birger 的答案那样的 blob? Access 中的 ole 与 SQL Server 中的 blob 相同。无论是 IMAGE 数据类型还是 varbinary(max) 等,blob 基本相同 谢谢。同意存储,但是当您存储“作为 OLE”时,您将文档(甚至是文档的一部分)放在一种信封中,包括有关可能的客户端的信息、格式描述、预览、等等...所以我想知道 iFilter 是否需要该 OLE 信封才能完成其工作? 我不这么认为。我肯定将 DOC/DOCX 推入 VarBinary(max) 数据类型,然后我可以对存储在文档中的关键字进行全文搜索,它就像一个魅力。我经常使用名为 Access Data Projects 的产品来使用 blob 填充 SQL Server。从字面上创建一个绑定到单个 SQL Server 表的新表单,这将自动使用 OleObject ActiveX 控件类型,它允许您双击存储在 SQL Server 中的 WordDocument 以启动单词。【参考方案3】:也许这会有所帮助:ACC2000: Reading, Storing, and Writing Binary Large Objects (BLOBs)。
他们的工作:以块的形式读取文件并使用 VBA 函数将其添加到 blob。
【讨论】:
我真的是 Access 和 VBA 的新手( 【参考方案4】:OLE 对象的字段,默认情况下会在表单上使用绑定对象框架。右键单击它,您可以插入一个对象。它带有文件浏览功能。双击该字段,将打开实际文档。
我建议使用 David 的建议和链接。除非您需要传输单个文件并希望包含所有 PDF。尺寸和性能将是一个问题。
如果安全是一个问题,并且 Access 文件是您拥有的唯一控件(您无法在包含所有链接文件的文件夹上设置安全性。),那么您将不得不嵌入。
【讨论】:
以上是关于使用表单在 MS Access 数据库中存储 PDF的主要内容,如果未能解决你的问题,请参考以下文章
ODBC 连接凭据如何存储在 MS Access 中? [关闭]
使用存储过程作为 MS Access 表单 Recordsource