最近,我的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的错误。
我可以做其他事情,比如下载文件,创建目录等等没有问题,但是当它到达这个语句时,它不会在之后退出访问。
答案 0 :(得分:2)
粘性的Access实例通常是挂起对象引用的结果。
如果Access按您描述的方式挂起,我会怀疑是一个令人讨厌的循环引用。
要研究循环引用,您基本上有两个选项:
Class_Initialize
/ {{1} })。对于使用类较大的较大代码库,这是一个很好的投资开始
如果您的问题出在无法控制代码的类中(就像您的情况一样),您可以考虑仅通过包装类来使用该外部类,您可以在其中记录创建/删除。当然,在棘手的情况下,终止包装类并不意味着终止包装类。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
,现在它不再发生了。