Vba 访问未退出
最近,我的Access.mdb数据库间歇性启动,不允许Access(Access 2003和2007)退出。如果我退出(无论是按X按钮还是从菜单退出),那么它会关闭数据库并显示为退出Access,但随后它会突然重新出现(没有任何数据库打开)。此时我退出的唯一方法是从任务管理器 我最近做的两个重要更改可能与此相关。1)我开始使用WinSCP.Net程序集访问ftp服务器,我必须按照说明安装并注册COM。2) 我开始使用ODBC,首先是作为链接表,然后是VBA ADO代码(请参阅)。我怀疑这第二个更改是否导致了这个问题,因为我在使用链接表和ADO时都遇到了这个问题 这并不是每次我打开数据库时都会发生的,我也没有注意到一种模式。是什么导致了这个奇怪的问题 编辑-我找到了问题的根源。通过在不同的点上分解ftp下载代码并查看它是否会退出,我将其缩减为以下内容:Vba 访问未退出,vba,ms-access,com,regasm,winscp,Vba,Ms Access,Com,Regasm,Winscp,最近,我的Access.mdb数据库间歇性启动,不允许Access(Access 2003和2007)退出。如果我退出(无论是按X按钮还是从菜单退出),那么它会关闭数据库并显示为退出Access,但随后它会突然重新出现(没有任何数据库打开)。此时我退出的唯一方法是从任务管理器 我最近做的两个重要更改可能与此相关。1)我开始使用WinSCP.Net程序集访问ftp服务器,我必须按照说明安装并注册COM。2) 我开始使用ODBC,首先是作为链接表,然后是VBA ADO代码(请参阅)。我怀疑这第二个更
Dim PDFFolders As Recordset
Set PDFFolders = CurrentDb.OpenRecordset("PDFFolders")
Dim syncOptions As TransferOptions
Set syncOptions = New TransferOptions
syncOptions.filemask = "*/*.pdf"
On Error Resume Next 'In case it doesn't exist
Do While Not PDFFolders.EOF
sess.SynchronizeDirectories SynchronizationMode_Local, info!RTFFolder, _
info!BasePDFFolder & "/" & PDFFolders!Name, False, , , _
syncOptions
PDFFolders.MoveNext
Loop
PDFFolders.Close
Set syncOptions = Nothing
Set PDFFolders = Nothing
On Error GoTo 0
如果它运行sess.synchronizeDirectory
语句,则access不会退出,否则会退出。在我看来,就像一只虫子赢了WinSCP
我可以做其他事情,比如下载文件、创建目录等,没有问题,但是当它到达这个语句时,它不会在之后退出access。access的粘性实例通常是由于挂起对象引用而导致的 如果访问按您描述的方式挂起,我会怀疑有一个讨厌的循环引用 要研究循环引用,基本上有两个选项:
如果您遇到的问题是无法控制代码的类(如您的情况),则可以考虑仅通过包装类来使用该外部类,您可以在其中记录创建/删除。当然,在棘手的情况下,包装类的终止并不意味着包装类的终止
顺便说一句,我强烈建议确保尽快将每个对象引用显式设置为Nothing:
Set MyObj = GetMyObject()
' Proceed with coding here later
' First write the following line
Set MyObj = Nothing
在本地错误处理的情况下,必须给予特别的考虑,以确保在任何情况下都将引用设置为Nothing
确保这一点的一个好方法是使用With块而不是显式变量(如果使用模式允许):
使用此模式,您可以保存声明局部变量,并且可以确保对象引用在当前方法中不存在。我仍然认为这是WinSCP中的一个错误,但我找到了一个解决方法。我注意到,只有当我从数据库中的表中获取信息,而不是输入硬编码字符串时,才会发生这种情况。所以我刚刚添加了
&vbNullString
,它连接了一个空白字符串,将数据类型从字段
更改为字符串
,现在这种情况不再发生了 我休假了一周,所以我无法查看它,但在我离开之前,我注意到每当运行特定方法时都会发生这种情况,所以应该很容易跟踪。我想好了会告诉你的。感谢您的详细回复。我找到了导致问题的语句-请参阅我编辑的问题。如果临时删除对SynchronizeDirectory()的调用,问题是否仍然存在?如果它消失了,您应该能够通过对SynchronizeDirectory的一次调用重现该问题,而不必在记录集上循环。@Paul Rohorzka-当我删除该调用时,该问题确实消失了,并且仅通过一次调用就发生了。我曾考虑制作一个只需会话连接和调用SynchronizeDirectory进行测试的简化程序,但我不明白这有什么意义。这可能是WinSCP中的一个bug。SynchronizeDirectory功能可能使用得不多,而且可能没有其他人尝试在VBA中使用它,因此问题从未出现过。我在他们的论坛上发布了一个bug报告。
With GetMyObject()
' Use the object's members here
End With