2

我试图了解如何使用 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
4

1 回答 1

1

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

用于存储这种二进制数据的唯一本地 VBA 类型是 Byte 值数组,但通常在处理字节数组时,我们最终会循环遍历并逐字节处理它们,这是乏味且低效的。

您可能会考虑使用二进制ADODB.Stream对象作为“变量”。您可以创建一个函数来检索附件字节并像这样在 Stream 中返回它们

Option Compare Database
Option Explicit

Public Function GetLogoAsStream() As ADODB.Stream
    Dim cdb As DAO.Database, rstMain As DAO.Recordset, rstAttach As DAO.Recordset2, fldAttach As DAO.Field2
    ' Project references required for early binding:
    '     Windows Script Host Object Model
    '     Microsoft ActiveX Data Objects 2.8 Library
    Dim fso As FileSystemObject, tempFileSpec As String
    Static strm As ADODB.Stream

    If strm Is Nothing Then
        Set fso = New FileSystemObject
        tempFileSpec = fso.GetSpecialFolder(TemporaryFolder) & "\" & fso.GetTempName
        Set fso = Nothing

        Set cdb = CurrentDb
        Set rstMain = cdb.OpenRecordset( _
                "SELECT [AttachmentFiles] " & _
                "FROM [AttachmentsTable] " & _
                "WHERE [Description]='SO logo'", _
                dbOpenSnapshot)
        Set rstAttach = rstMain("AttachmentFiles").Value
        ' make sure we use the correct file extension
        tempFileSpec = tempFileSpec & "." & rstAttach.Fields("FileType").Value
        Set fldAttach = rstAttach.Fields("FileData")
        fldAttach.SaveToFile tempFileSpec
        Set fldAttach = Nothing
        rstAttach.Close
        Set rstAttach = Nothing
        rstMain.Close
        Set rstMain = Nothing
        Set cdb = Nothing

        Set strm = New ADODB.Stream
        strm.Type = adTypeBinary
        strm.Open
        strm.LoadFromFile tempFileSpec
        Kill tempFileSpec
    End If
    strm.Position = 0
    Set GetLogoAsStream = strm
End Function

然后如果你有一个像这样的带有空图像控件的报告

报表设计.png

和一个On Load像这样的事件过程来从你的“变量”加载图像控件.PictureData(实际上是一个返回 ADODB.Stream 的函数)

Private Sub Report_Load()
    Me.LogoImage.PictureData = GetLogoAsStream.Read
End Sub

它可以产生这样的东西

报告预览.png

于 2014-11-12T19:17:00.583 回答