【问题标题】:Saving and retrieving attachments to a shared Access db, attachment not found for other users将附件保存和检索到共享 Access db,未找到其他用户的附件
【发布时间】:2022-07-09 11:55:49
【问题描述】:

我有一个 Excel 宏,用于对用户还附加图像的工作订单进行 CRUD。所有内容都保存到 SharePoint 文件夹上的 Access db。

例如,创建了部门 A 的工作订单,并且我们将图片附加到 Access 表中的附件字段的记录中。 A 部门通过已通过 SharePoint 共享的 Access 数据库接收工单。

所有用户都使用相同的工作簿、宏、代码等。

使用图像更新记录后,将显示以下内容:

Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim rs As DAO.Recordset, rsP As Variant, strFile As String
Dim rsStat As DAO.Recordset

Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(db_path.Value, False, False, "MS Access;PWD=" & p.Value)

Set rsStat = db.OpenRecordset("SELECT STATUS FROM womhst WHERE wo_no = " & wo_no)

If rsStat.Fields(0).Value = "Closed" Then
    btnAddPic.Enabled = False
Else
    If Not user_role.Value = 4 Then
        btnAddPic.Enabled = False
    Else
        btnAddPic.Enabled = True
    End If
End If

Set rs = db.OpenRecordset("SELECT vio_image FROM womhst WHERE wo_no = " & wo_no)
Set rsP = rs.Fields("vio_image").Value

If rsP.RecordCount = 1 Then iAtt.Picture = LoadPicture(rsP.Fields(2).Value)

如果我从我的机器上运行它,图像会显示在图像控件中。

但是,当我从其他用户的计算机上运行宏并连接到通过 SharePoint 文件夹共享的 Access db 时,当我尝试显示图像时出现“找不到文件”错误。

我知道以下几点:

  1. 已在第二个用户的计算机中更新了访问权限。如果我在该用户的机器上打开加密的数据库,我可以看到该字段包含所有应有的图像。
  2. 表格上还有其他字段,宏也在读取这些字段。所有这些都读得很好。如果我在一台机器上对表进行更新,则会反映更改,并且宏会读取它们(仅附件字段中的文件存在问题)
  3. Access 正在将图像保存到每台机器的缓存中

在我尝试从第二个用户的机器上查看图像(并得到错误)后,我回到我的机器上。此时,我也开始收到“找不到文件”错误。

我认为这与缓存路径有关。

图片更新到Access的代码:

Dim db As DAO.Database
Dim ws As DAO.Workspace

Dim rst As DAO.Recordset
Dim attachFld As DAO.Recordset

Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(db_path.Value, False, False, "MS Access;PWD=" & p.Value)

Set rst = db.OpenRecordset("SELECT * FROM womhst WHERE wo_no = " & wo_no & ";", dbOpenDynaset)
    
rst.FindFirst "wo_no = " & wo_no
If Not rst.NoMatch Then

    rst.Edit
    
        Set attachFld = rst.Fields("vio_image").Value
        
        'If record alrady has an image, delete such that there always only one file saved
        If attachFld.RecordCount <> 0 Then
            attachFld.Delete
        End If
        
        attachFld.AddNew
        
            'user can get the file with the file dialog
            Dim objFSO As New FileSystemObject
            Dim fileSelected As String
            Dim myFile As Object
            
            Set myFile = Application.FileDialog(msoFileDialogOpen)
            With myFile
            .Title = "Choose File"
            .AllowMultiSelect = False
            If .Show <> -1 Then
                Exit Sub
            End If
            fileSelected = .SelectedItems(1)
            End With

            attachFld.Fields("FileData").LoadFromFile fileSelected
            
        attachFld.Update
        
    rst.Update

End If

rst.Close
db.Close
ws.Close

【问题讨论】:

    标签: excel vba database ms-access dao


    【解决方案1】:

    我找到了解决方法:

    当我尝试从 Access 数据库中打开一张照片时,我将它保存到一个临时文件夹中。用户查看照片后,VBA删除临时目录:

    Option Explicit
    Dim imgDir As String
    
    Private Sub btnExit_Click()
    
        DeleteTemp
        Unload Me
        
    End Sub
    
    Private Sub UserForm_Initialize()
    
        LoadImage
    
    End Sub
    
    
    Private Sub LoadImage()
    
        Dim db As DAO.Database
        Dim ws As DAO.Workspace
    
        Dim rst As DAO.Recordset
        Dim attachFld As DAO.Recordset
    
        Set ws = DBEngine.Workspaces(0)
        Set db = ws.OpenDatabase(db_path.Value, False, False, "MS Access;PWD=" & p.Value)
    
        Set rst = db.OpenRecordset("SELECT * FROM womhst WHERE wo_no = " & wo_no & ";", dbOpenDynaset)
        
        Set attachFld = rst.Fields("vio_image").Value
    
        Dim wd As String
        wd = ThisWorkbook.path
        imgDir = wd & "\temp3"
        
        MkDir imgDir
        
        attachFld.Fields("FileData").SaveToFile imgDir
        
        iAtt.Picture = LoadPicture(imgDir & "\" & attachFld.Fields(2))
        
    End Sub
    
    Private Sub DeleteTemp()
    
        Dim FSO As New FileSystemObject
        Set FSO = CreateObject("Scripting.FileSystemObject")
     
        FSO.DeleteFolder imgDir, False
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多