Image 将附件字段分配给Access 2010中的变量

Image 将附件字段分配给Access 2010中的变量,image,ms-access-2010,attachment-field,Image,Ms Access 2010,Attachment Field,我试图了解如何使用Access 2010中提供的新附件字段。我想将表中的值直接赋给变量。我知道如果我使用中间表单,我可以做到这一点,但依赖表单从表中获取值似乎是草率的编码。是否有办法获取附件字段中的内容并将其直接分配给变量?我有多个实例,这对我来说很方便。第一个实例是,我想获取存储在附件字段中的照片,以指定给功能区。第二个实例是将表中的公司徽标加载到变量中,并将其保存在内存中,以便根据需要在整个程序中使用 到目前为止,我的代码是这样的,但它给了我一个类型不匹配错误: Dim ParentRS A

我试图了解如何使用Access 2010中提供的新附件字段。我想将表中的值直接赋给变量。我知道如果我使用中间表单,我可以做到这一点,但依赖表单从表中获取值似乎是草率的编码。是否有办法获取附件字段中的内容并将其直接分配给变量?我有多个实例,这对我来说很方便。第一个实例是,我想获取存储在附件字段中的照片,以指定给功能区。第二个实例是将表中的公司徽标加载到变量中,并将其保存在内存中,以便根据需要在整个程序中使用

到目前为止,我的代码是这样的,但它给了我一个类型不匹配错误:

Dim ParentRS As Recordset, ChildRS As Recordset, Img As Attachment
Set ParentRS = CurrentDb.OpenRecordset("SELECT * FROM LtblImg;", dbOpenSnapshot)
If ParentRS.RecordCount > 0 Then
    Set ChildRS = ParentRS("Img").Value
    If ChildRS.RecordCount > 0 Then
        Set Img = ChildRS("FileData")
    End If
    ChildRS.Close
End If
ParentRS.Close

是的,
Dim Img As Attachment
看起来很诱人,但是
Attachment
(实际上是
Access.Attachment
)指的是可以在表单上使用的附件控件(就像
Access.TextBox
),似乎不适合您的预期用途

存储这类二进制数据的唯一原生VBA类型是字节值数组,但通常在处理字节数组时,我们会逐个字节循环处理它们,这既繁琐又低效

你可以考虑使用二进制<代码> AdOb.StaseObjor作为变量。您可以创建一个函数来检索附件字节,并以流的形式返回它们,如下所示

选项比较数据库
选项显式
公共函数GetLogoAsStream()作为ADODB.Stream
Dim cdb作为DAO.Database,rstMain作为DAO.Recordset,rstatach作为DAO.Recordset2,fldAttach作为DAO.Field2
'早期绑定所需的项目引用:
'Windows脚本主机对象模型
'Microsoft ActiveX数据对象2.8库
将fso设置为文件系统对象,将tempFileSpec设置为字符串
作为ADODB.Stream的静态strm
如果strm什么都不是,那么
Set fso=新文件系统对象
tempFileSpec=fso.GetSpecialFolder(临时文件夹)&“\”&fso.GetTempName
设置fso=无
设置cdb=CurrentDb
Set rstMain=cdb.OpenRecordset(_
“选择[附件]”&_
“来自[附件]”&_
“其中[说明]=‘SO标志’”_
dbOpenSnapshot)
设置rstatach=rstMain(“AttachmentFiles”).Value
'确保使用正确的文件扩展名
tempFileSpec=tempFileSpec&“&rstatach.Fields(“FileType”).Value
设置fldAttach=rstatach.Fields(“文件数据”)
fldAttach.SaveToFile临时文件规范
设置fldAttach=无
rstAttach,关闭
设置rstAttach=Nothing
rstMain,关闭
设置rstMain=Nothing
设置cdb=无
设置strm=newadodb.Stream
strm.Type=adTypeBinary
标准开启
strm.LoadFromFile tempFileSpec
杀死tempFileSpec
如果结束
标准位置=0
设置GetLogoAsStream=strm
端函数
然后如果你有,比如说,一个像这样的带有空图像控件的报告

以及类似这样的
加载事件过程,从“变量”(实际上是返回ADODB.Stream的函数)加载图像控件的
.PictureData

专用子报告\u加载()
Me.LogoImage.PictureData=GetLogoAsStream.Read
端接头
它可以产生这样的东西


谢谢您的详尽回答。我认为关于附件变量实际上是什么,你一定是对的。我一直试图将附件记录集字段分配给附件变量,无论我做了什么尝试,它都表示类型不匹配,所以您可能是对的,它不打算用作自变量。我认为你给出的答案看起来和其他答案一样好。我对尝试它有点犹豫,因为它使用AdoDB,我听说这可能会导致关于它是否可用和受支持的问题,但我可能会尝试使用它。谢谢你抽出时间。