【发布时间】:2018-07-20 10:15:56
【问题描述】:
我知道这个主题已经被广泛覆盖,但我无法找到解决我的特定问题的方法。
我有一个表,其中有一列 附件 是 OLE 对象数据类型。表的后端是 SQL Server 表,Attachments 列的数据类型为 VARBINARY(MAX)。
如果我右键单击 Access 中的 Attachments 字段,会弹出一个菜单,其中包含 Insert Object... 的选项字段中的文件。
以这种方式插入的文件只需双击该字段即可打开以进行查看和编辑。
现在。我需要使用 VBA 做同样的事情。我需要获取文件列表并将它们插入到相应行的 Attachments 字段中。这应该不是一项艰巨的任务,因为众所周知如何使用 ADODB.Stream 在字段中插入文件。下面是一个简单的代码来试试这个概念:
Private Sub POC()
Dim db As DAO.Database
Dim rsa As DAO.Recordset
Dim stream As ADODB.stream
Set db = CurrentDb()
Set rsa = db.OpenRecordset("ZipCodeAttachments", dbOpenDynaset, dbSeeChanges)
rsa.MoveFirst
rsa.MoveNext
rsa.Edit
Set stream = New ADODB.stream
stream.Type = adTypeBinary
stream.Open
stream.LoadFromFile Application.CurrentProject.Path & "\Attachments\537.zip"
rsa.Fields("Attachments").value = stream.Read
rsa.Update
rsa.Close
Set rsa = Nothing
Set dba = Nothing
End Sub
代码在第二行的Attachments 字段中插入一个文件。我可以验证该值已通过 SSMS 添加。但是,当我尝试像之前对第一行所做的那样打开该字段进行查看和编辑时,这次我收到了一个错误:
显然,使用 VBA 保存文件的方式有问题。
我做错了什么?如何使用 VBA 获得与使用 Access 用户界面相同的结果?
【问题讨论】:
-
你真的在使用sql server吗?屏幕截图中的所有内容均来自 Access。
-
一个重要的区别是:您是否希望像文件 BLOB 一样存储文件(通过 VBA、其他编程语言等很容易使用 Blob,但通过 Access GUI 很难使用)或一个 OLE 包对象(很容易通过 GUI 使用,但几乎不可能通过 VBA 和很难通过 VBA 使用)?我可以向您展示如何将 OLE 包对象从文件加载到记录集中,但我强烈建议您使用普通文件 BLOB。
-
OLE 对象类似于嵌入的 Word 或 Excel 文档,而不是 BLOB。它们应该具有非常特定的文件格式,并且只能由其注册的应用程序打开。Zip 不是 OLE 对象。
-
感谢大家提出非常好的问题并愿意提供帮助。
-
对 Seam Lange:是的。我使用 SQL Server 作为后端。所有数据都保存在 SQL Server 中。我使用 Access 作为前端。
标签: sql-server object ms-access vba ole