源设置为不可用的 UNC 路径的图像控制会导致性能非常慢



>我有一个带有图像控件的MS Access表单,其控制源是一个名为PhotoPath的字符串字段。如果 PhotoPath 指向不存在的 UNC 路径,则窗体需要一分钟以上才能打开。

如果出现以下情况,表单将快速打开: 1. 照片路径指向可用的文件,或 2. 照片路径为空 3. PhotoPath 指向不存在的驱动器上的文件,例如 D:\MyPhoto.jpg(其中没有 D: 驱动器(

但是,如果 PhotoPath 包含 UNC 路径(如 \服务器\图像\MyPhoto.jpg则窗体需要一分钟以上才能打开。

不幸的是,我无法使用映射驱动器来绕过该问题,因为我的客户端没有为所有需要使用数据库的员工提供相同的映射。

我在 Form_Current 事件中有代码来尝试测试该文件是否存在,如果不存在,则将其作为控件的源删除:

If IsNull(Me.strPhotoPath) Then
Debug.Print "No photo"
Else
Debug.Print "Have photo"
If CheckFileExists(Me.strPhotoPath) Then
Me.imgStudentPhoto.Picture = Me.strPhotoPath
Me.imgStudentPhoto.Visible = True
Else
Me.imgStudentPhoto.Picture = ""
Me.imgStudentPhoto.Visible = False
End If
End If

但是,这没有帮助,因为 CheckFileExists 代码在测试文件是否存在时同样缓慢。

下面是 CheckFileExists 代码:

Dim fso As Scripting.FileSystemObject
Set fso = New Scripting.FileSystemObject
CheckFileExists = fso.FileExists(FilePath)

没有显示任何错误,并且所有内容都会生成预期的结果,但是在尝试访问不存在的 UNC 路径时,性能慢得令人无法接受。

尝试使用Dir函数而不是 FSO。

取代

If IsNull(Me.strPhotoPath) Then

If Len(Dir(Me.strPhotoPath)) = 0 Then

最初,您可以检查路径是否有效:

ServerImagesMyPhoto.jpg

不是,而:

\ServerImagesMyPhoto.jpg

可能是有效的。

实际上问题是您可以执行各种 dir(( 命令等。底线是,如果图像控件尝试解析为不可用的网络路径,则会出现巨大的延迟。

但是,您可以做的是在应用程序启动时设置全局变量(如果文件夹可用(或不可用。

然后,对于具有路径名的控件,例如:

\server01Pictureshouse.png

您将上述源替换为如下函数:

=GetPicture('\server01\house.png'(

因此,图片的来源可以是VBA函数。

现在,您的函数可能如下所示:

Public Function GetPicture(s as String) as string
if gblFolder = True then
GetPicture = s
Else
GetPicture = ""
End If
End Function

现在的结果是,当您在应用程序启动时设置 gblFolder 标志时,该函数不返回任何内容。这反过来又会阻止 Access 尝试的巨大缓慢网络解析过程。如果应用程序不是编译的accDE(应该是(,那么我建议将true/false值放入temp!var中,因为使用accDB,任何未处理的错误在任何时候都会爆发并重新设置所有全局VBA变量。但是,如果您使用 accDE,则永远不会为给定的访问会话重新设置任何和所有变量,因此您可以自由地保留 VBA 变量 - 如果您使用 accDE 而不是 accDB,则永远不会因任何原因或任何未处理的错误而重新设置它们。

最新更新