访问权限未退出

时间:2013-09-18 08:38:22

标签: vba ms-access com regasm winscp

最近,我的Access .mdb数据库间歇性地启动,不允许Access(Access 2003和2007)退出。如果我退出(无论是通过按X按钮还是从菜单,然后它关闭数据库并且似乎也退出Access,但它突然重新出现(没有任何数据库打开)。唯一的方法让我退出点来自任务管理员。

我最近做了两件可能有关的重大变化。 1)我开始使用WinSCP .Net程序集访问ftp服务器,我必须从说明here安装并注册COM。 2)我开始使用ODBC,首先使用ODBC作为链接表,然后使用VBA ADO代码(参见this)。我怀疑第二次更改是否导致了这个问题,因为我在使用链接表时和使用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.SynchronizeDirectories语句,则访问权限不会退出,否则就会退出。在我看来就像一个赢得WinSCP的错误。

我可以做其他事情,比如下载文件,创建目录等等没有问题,但是当它到达这个语句时,它不会在之后退出访问。

2 个答案:

答案 0 :(得分:2)

粘性的Access实例通常是挂起对象引用的结果。

如果Access按您描述的方式挂起,我会怀疑是一个令人讨厌的循环引用

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

  1. 检查您的代码是否存在循环依赖 - 这可能会变得乏味且不那么容易。但是,如果你深入了解你的代码库,你可能会怀疑首先要看哪里。
  2. 向代码添加日志记录 - 如果您无法通过单独检查发现问题,可以考虑添加对象创建/删除的后续日志记录(通过Class_Initialize / {{1} })。对于使用类较大的较大代码库,这是一个很好的投资开始 如果您的问题出在无法控制代码的类中(就像您的情况一样),您可以考虑仅通过包装类来使用该外部类,您可以在其中记录创建/删除。当然,在棘手的情况下,终止包装类并不意味着终止包装类。

  3. BTW,我强烈建议确保将每个对象引用明确地设置为Nothing ASAP:

    Class_Terminate

    在本地错误处理的情况下必须给出特别的想法,以确保在任何一种情况下都将引用设置为Nothing。

    确保这样做的好方法是使用With-block而不是显式变量(如果使用模式允许):

    Set MyObj = GetMyObject()
    ' Proceed with coding here later
    ' First write the following line
    Set MyObj = Nothing
    

    使用此模式,您可以保存声明局部变量,并确保对象引用不能在当前方法中存活。

答案 1 :(得分:1)

我仍然认为这是WinSCP中的一个错误,但我找到了解决方法。我注意到只有当我从数据库中的表中获取信息时才会发生这种情况,而不是如果我输入硬编码的字符串。所以我刚刚添加了& vbNullString,它连接了一个空白字符串,它将数据类型从Field更改为String,现在它不再发生了。