0

我有一个使用 VBA 代码的数据库应用程序,该代码已达到其 2GB 大小限制,每个记录都带有图像附件。我们希望应用程序中的所有表单都不再“上传”图像作为记录的附件,而是将它们上传到网络服务器上的目录并引用表单中的图像文件。

在这一点上,我试图找出解决这个问题的最佳方法。让用户通过访问表单以某种方式拉出“上传”对话框是否可行?我已经为 VBA 中的打开文件对话框尝试了几个拼凑在一起的解决方案,但它们从来没有完全正常工作。

摘要:文件类型为“.ACCDB”,我需要允许用户以新记录创建表单上传图像,将图像存储在网络目录中,并在整个应用程序中即时访问。

提前致谢。

4

1 回答 1

0

从一般数据库的角度来看,您不应该将图像直接存储在数据库中,除非它们非常小(大约小于 1 MB),并且您实际上有空间来存储它们。最常见的做法是将图像路径存储在数据库中,然后在需要时直接从存储图像的文件目录中加载这些图像。它会增加另一个级别的复杂性,但会从根本上减少您的数据库大小。

更新:

此代码允许用户单击表单中的某个元素框架,将路径存储在数据库中(路径为 username.jpg),然后在单击的框架中向用户显示图片:

Private Sub SignatureFrame_Click()
On Error GoTo ErrorHandler

    ' Get path for the new picture from a dialog box
    Dim Path As String
    Dim fd As FileDialog
    Dim ffs As FileDialogFilters
    Set fd = Application.FileDialog(msoFileDialogOpen)
    With fd
        Set ffs = .Filters
        With ffs
          .Clear
          .Add "Pictures", "*.jpg"
        End With
        .AllowMultiSelect = False
        If .Show = False Then Exit Sub
        Path = .SelectedItems(1)
    End With

    ' Update the picture in the user interface
    Me![SignatureFrame_Click].Picture = Path

    ' Copy the signature into the local Signature folder of the DB
    Dim fs As Object
    Dim oldPath As String, newPath As String, file As String
    oldPath = Path 'Full path the file is located in
    newPath = CurrentProject.Path & "\Signatures\Users\" & Screen.ActiveForm.UserName & ".jpg"  'Folder and path to copy file to
    Set fs = CreateObject("Scripting.FileSystemObject")
    fs.CopyFile oldPath, newPath 'This file was an .jpg file
    Set fs = Nothing

    ' Set the new picture path for the form
    Screen.ActiveForm.SignaturePath = newPath

Exit Sub

ErrorHandler:
    MsgBox "Could not upload the image. Please check that the file format is of type jpg."
    Resume Next
End Sub

然后在稍后的某个时间点以其他形式,您可以像这样检索图像:

Me!SignatureFrame.Picture = CurrentProject.Path & "\Signatures\username.jpg"

PS:代码已经在SO编辑器中翻译过了,所以我不能保证没有错误。

希望有帮助!

于 2013-09-09T17:44:50.737 回答