Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Can';无法消除访问腐败_Vba_Ms Access_Ms Access 2007 - Fatal编程技术网

Vba Can';无法消除访问腐败

Vba Can';无法消除访问腐败,vba,ms-access,ms-access-2007,Vba,Ms Access,Ms Access 2007,我公司的Access数据库最近出现了一些严重问题。我们得到的错误似乎表明了腐败——以下是最常见的错误: 访问文件时出错。网络连接可能已丢失 编译此函数时出错 没有错误,访问完全崩溃 我注意到这些错误只发生在编译的数据库中。如果我反编译它,它工作得很好。如果我获取一个未编译的数据库并对其进行编译,它就可以正常工作——直到下次尝试打开它为止。看来,将数据库编译成.ACCDE文件解决了这个问题,这正是我一直在做的,但有人报告说,这个问题又出现在她身上,这让我非常紧张 我尝试将数据库中的所有对象导出

我公司的Access数据库最近出现了一些严重问题。我们得到的错误似乎表明了腐败——以下是最常见的错误:

  • 访问文件时出错。网络连接可能已丢失
  • 编译此函数时出错
  • 没有错误,访问完全崩溃
我注意到这些错误只发生在编译的数据库中。如果我反编译它,它工作得很好。如果我获取一个未编译的数据库并对其进行编译,它就可以正常工作——直到下次尝试打开它为止。看来,将数据库编译成.ACCDE文件解决了这个问题,这正是我一直在做的,但有人报告说,这个问题又出现在她身上,这让我非常紧张

我尝试将数据库中的所有对象导出为文本,从一个全新的数据库开始,然后再次导入,但这并不能解决问题。一旦我将所有对象导入到干净的数据库中,问题又出现了

最后一点似乎是相关的,但我不明白怎么回事。在我向数据库添加一些类模块时,问题就开始了。这些类模块使用VBA
Implements
关键字,通过引入一些多态性来清理我的代码。我不知道为什么这会导致问题,但时间似乎表明了一种关系

我一直在寻找解释,但还没有找到。有人有什么建议吗

编辑:除标准参考文献外,数据库还包括一些参考文献:

  • Microsoft ActiveX数据对象2.8
  • Microsoft Office 12.0
  • Microsoft脚本运行时
  • Microsoft VBScript正则表达式5.5

调试Access时我所做和使用的一些事情:

  • 在多个虚拟机中测试我的应用程序。您可以在Win8上使用,也可以设置各种受控测试环境,例如在WinXP、Win7、Win8、32位或64位上进行测试,只要与操作系统范围和用户位匹配即可

  • 我使用的是一个聪明的实用程序,它只向应用程序中添加了几个类(没有外部依赖),并允许您在高层捕获错误,并准确地显示错误发生的位置。这对于捕捉和记录奇怪的错误是非常宝贵的,尤其是在现场

  • 如果这个问题只针对一个或几个用户,我会尝试找出他们配置的特殊之处。如果没有什么不合适的地方,我会完全取消安装所有Office组件,并在清理注册表中的悬空键并删除旧安装中的所有文件夹痕迹后重新安装它

  • 如果您的用户不需要完整版本的Access,只需在其计算机上使用免费版本即可

  • 确保始终使用一致的Access版本:如果您使用的是Access 2007,请确保您的开发人员计算机也使用该版本,并且所有其他用户也仅使用该版本,并且Access 2010/2013中没有任何组件

  • 尝试确定崩溃是否总是发生在相同的用户操作周围。我使用一个简单的日志文件,在设置调试标志时写入该文件。日志文件是一个简单的文本文件,每当我记录一些东西时,我都会打开/写入/关闭它(我不会保持打开状态以确保数据被刷新到文件中,否则当访问崩溃时,日志文件中可能只有旧数据,因为新数据可能仍在缓冲区中)。我记录的内容是,例如,敏感函数入口/出口、从代码执行的SQL查询、表单打开/关闭等

  • 一般来说,确保应用程序的编译没有问题(我的意思是在IDE中执行调试>编译时)。这一阶段的任何问题都必须解决

  • 绝对要确保关闭所有打开的记录集,最好先将它们的变量设置为
    Nothing
    。VBA对悬挂引用不像以前那样敏感,但我发现这是一种很好的做法,尤其是当您不能绝对确定这些引用是否会被释放时(尤其是在模块级或类级执行操作时,例如,在模块级或类级,作用域的寿命可能比预期的长)

  • 同样,确保正确销毁在类(和子类/函数)中创建的任何COM对象。
    Class\u Terminate
    析构函数必须显式清除所有COM对象。如果创建COM对象(您提到使用ADOX、脚本对象和正则表达式),则在关闭窗体时,这也是有效的。通常,跟踪创建的对象是至关重要的:确保通过重置对象(例如,在字典上使用
    RemoveAll
    ,然后将其引用分配给
    Nothing
    ,来显式释放所有对象

  • 不要在错误恢复时过度使用
    或在错误转到时过度使用
    。除非绝对需要从无法检测到的错误中恢复,否则我几乎从不使用这些。使用这些错误捕获结构可以隐藏大量错误,否则会显示代码有问题。我更喜欢编写Defensive而不是必须处理异常。
    对于测试,请禁用错误捕获以查看它是否隐藏了崩溃的原因

  • 请确保前端是用户计算机的本地前端,您提到他们从网络获取各自的前端,但我不确定他们是从那里运行前端,还是在本地计算机上复制前端。无论如何,它应该是本地的,而不是远程文件夹

  • 您提到使用SQL Server作为后端。请尝试跟踪正在执行的所有查询。问题可能来自与SQL Server的通信、损坏的驱动程序、阻止某些查询运行的安全问题、返回意外数据的查询等。请仔细查看服务器上的日志文件和事件日志,以了解是否存在错误