-1

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

我最近做了两个可能相关的重大改变。1) 我开始使用 WinSCP .Net 程序集来访问一个 ftp 服务器,我必须按照此处的说明安装并注册 COM 。2) 我开始使用 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 的错误一样。

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

4

2 回答 2

2

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

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

要调查循环引用,您基本上有两种选择:

  1. 检查循环依赖的代码——这可能会变得乏味且不那么容易。但是,如果您深入了解您的代码库,您可能会怀疑首先要看哪里。
  2. 将日志记录添加到您的代码中- 如果您无法仅通过检查发现问题,您可以考虑添加对象创建/删除的后续日志记录(通过Class_Initialize/ Class_Terminate)。对于大量使用类的大型代码库,这是一项不错的投资。
    如果您的问题在于您无法控制代码的类(如您的情况),您可能会考虑仅通过可以记录创建/删除的包装类来使用该外部类。当然,在棘手的情况下,包装类的终止并不意味着被包装类的终止。

顺便说一句,我强烈建议确保尽快将每个对象引用明确设置为 Nothing:

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

在本地错误处理的情况下必须特别考虑,以确保在任何一种情况下都设置对 Nothing 的引用。

确保这一点的一个好方法是使用 With 块而不是显式变量(如果使用模式允许):

With GetMyObject()
   ' Use the object's members here
End With

使用这种模式,您无需声明局部变量,并且可以确保对象引用不会在当前方法中存在。

于 2013-09-18T10:57:28.243 回答
1

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

于 2013-10-16T05:36:21.047 回答