Vba 访问未退出

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代码(请参阅)。我怀疑这第二个更

最近,我的Access.mdb数据库间歇性启动,不允许Access(Access 2003和2007)退出。如果我退出(无论是按X按钮还是从菜单退出),那么它会关闭数据库并显示为退出Access,但随后它会突然重新出现(没有任何数据库打开)。此时我退出的唯一方法是从任务管理器

我最近做的两个重要更改可能与此相关。1)我开始使用WinSCP.Net程序集访问ftp服务器,我必须按照说明安装并注册COM。2) 我开始使用ODBC,首先是作为链接表,然后是VBA ADO代码(请参阅)。我怀疑这第二个更改是否导致了这个问题,因为我在使用链接表和ADO时都遇到了这个问题

这并不是每次我打开数据库时都会发生的,我也没有注意到一种模式。是什么导致了这个奇怪的问题

编辑-我找到了问题的根源。通过在不同的点上分解ftp下载代码并查看它是否会退出,我将其缩减为以下内容:

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的粘性实例通常是由于挂起对象引用而导致的

如果访问按您描述的方式挂起,我会怀疑有一个讨厌的循环引用

要研究循环引用,基本上有两个选项:

  • 检查循环依赖项上的代码——这可能会变得单调乏味,也不那么容易。但是,如果您对代码库有深入的了解,您可能会怀疑首先应该去哪里查找
  • >强>将日志添加到代码 -如果您不能单独通过检查发现问题,则可以考虑添加对象创建/删除的后续日志(通过<代码>类初始化> <代码> />代码> CaseMyEclipse < /代码>。对于大量使用类的大型代码库,这是一项很好的投资。
    如果您遇到的问题是无法控制代码的类(如您的情况),则可以考虑仅通过包装类来使用该外部类,您可以在其中记录创建/删除。当然,在棘手的情况下,包装类的终止并不意味着包装类的终止
    顺便说一句,我强烈建议确保尽快将每个对象引用显式设置为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