我们有一个用Access编写的自定义程序,其中包含奇怪的崩溃。我们添加了错误处理,记录并通过电子邮件发送在我们自己的代码中发生的任何崩溃,这使我们能够修复我们生成的大多数错误,但有时崩溃发生在我们的代码之外。
我们发现在2013年出现新版本的一个示例 - 我们有一个在某个字段中编辑数据后会崩溃的表单 - 新条目很好但创建记录后的任何编辑都会导致完全崩溃关闭MS Access。我们花时间并最终追踪到我们的一些代码迫使表单移动到下一个记录,这个字段是行中的最后一个字段,所以Access本身也试图移动到下一个记录。这是自2007年以来一直在系统中,但在2013年开始导致程序关闭。
有没有办法陷阱和诊断MS访问内的程序级崩溃? Windows事件查看器仅显示以下内容:
错误应用程序名称:MSACCESS.EXE,版本:15.0.4454.1501,时间戳:0x50a35ef4错误模块名称:MSACCESS.EXE,版本:15.0.4454.1501,时间戳:0x50a35ef4异常代码:0xc0000005错误偏移量:0x00116452错误进程id:0x1398错误应用程序启动时间:0x01ce6e665043d8be错误应用程序路径:C:\ Program Files(x86)\ Microsoft Office \ Office15 \ MSACCESS.EXE错误模块路径:C:\ Program Files(x86)\ Microsoft Office \ Office15 \ MSACCESS.EXE报告ID: 6cfcb0eb-da62-11e2-8966-842b2b86f028
这是一个老线程,但它是谷歌的最佳结果之一,所以我想我会给出答案。当您遇到“Access遇到问题并需要关闭”时,您可以采取哪些步骤。通常在事件日志中,您将看到:
Faulting application name: MSACCESS.EXE, version: 15.0.4869.1000, time stamp: 0x57e12b41
Faulting module name: MSACCESS.EXE, version: 15.0.4869.1000, time stamp: 0x57e12b41
Exception code: 0xc0000005
排除故障可能令人沮丧。以下是我采取的行动清单,从最少侵入性到最具侵入性。我不只是发明了这些修复 - 多年来我亲眼目睹了每个修复解决问题。
反编译数据库
您表示反编译每个版本是策略。良好的政策 - 但每次出现错误后都要明确地做。原因是因为您可能正在修复核心问题,但由于容器损坏而没有注意到。
测试计算机内存
特别是如果崩溃仅限于一台或两台机器 - 这样做。 检查事件查看器。是否有相当多的“错误”消息描述了应用程序崩溃,并且错误模块有所不同?如果是这样,那么如果它不是一个损坏的Windows安装,那么你可能会考虑内存问题。
我确信有很多很棒的内存测试器,但我鼓励你使用一个能够捕获丢失位的正确测试。 MemTest86是一个老人,但是一个好东西。有current version和一些同样好的forks。
开始测试,让它在工作时间运行。我在建筑物中的功率不好导致内存错误,因此保持变量相同。
从表单中删除二进制数据
有时崩溃发生在一个表单或报告中。如果它是损坏的二进制数据,那么崩溃应该发生在具有不同用户的不同计算机上。如果是这种情况,请按照以下步骤操作。 (仅限高级用户)
摆脱“OLE对象”字段
如果您在Access中存储了图像或其他数据,那么您应该找到更好的方法。存储OLE数据时,根据存储它的计算机上的软件(和软件版本)存储它。当另一台计算机在窗体上显示该OLE对象数据但没有安装确切的软件/版本时 - 您经常会遇到崩溃。
如果要存储图像数据,则更好的方法是存储文件名,而是将图像保存到标准位置。较新版本的访问具有本机控件,使其成为可行的方法。
重建整个数据库
这是很多工作,所以当你用尽所有其他选项时我会保存这个。如果所有用户都出现问题,则只需执行此操作。如果没有为所有用户发生,那么它不是一个损坏的数据库。
与删除二进制数据的步骤类似,您将从头开始重建数据库。当我到达这一步时,我处于全偏离模式。也许它有点仪式化,但我做的一切都是细致的,没有捷径和非常小心,不通过直接复制或进口/出口“保存”腐败。作为我最后的立场,我认为这并没有解决这个问题。幸运的是,自Access 2000以来,我没有必要这样做。
完成所有操作后 - 您应该拥有一个非常干净的数据库容器。
从测试中删除其他变量
网络腐败
不要将客户端加载到网络之外。把它放在本地驱动器上并从那里运行它。
企业建设
如果您所处的企业环境使用“计算机构建”并且在反编译,测试内存和剥离二进制数据方面没有成功 - 那么在IT团队为用户提供具有测试机器的测试机器之前,拒绝进行进一步测试仅安装了Windows,Office和Service Pack。我通常喜欢自己安装,所以我知道我可以相信它。应手动安装所有软件和更新,而无需使用无人参与安装。不要在此计算机上安装防病毒软件。
我有IT部门拒绝这一点纯粹的F.U.D.并且不合理 - 如果这是您遇到的问题,请在“帮助我帮助您”背景下洗手。
不好的力量
如内存部分所述 - 电源波动可能导致计算机错误。如果数据库位于工业建筑中 - 那么请尝试使用电源调节器或提供清洁电源的UPS(关闭电池,而不是通过金属氧化物压敏电阻的主电源)
另外,检查插入电源插座或插座的电源线。确保仪表和电压规格足够。我之所以这么说,是因为IT部门经常将电源线插入工作站,只需将机器拆下即可。多年以后,他们使用更强大的电源,但没有关闭电缆。它有所作为。如有疑问,请带上一根新的,更粗的电缆。
附录
从最初发布这个以来,我遇到了一些新的。多次遇到我的是移动到Access 2016时的ODBC驱动程序。如果您的数据库在Access 2013下工作正常,但在Access 2016中可靠地崩溃,那么问题可能是ODBC驱动程序。跳一跳,试着找出是否有更新的驱动程序。如果没有成功,则通过创建新数据库并在VBS中进行ODBC调用来确认它是否是ODBC驱动程序。如果你得到同样的崩溃 - 它的驱动程序。如果没有更新的驱动程序,您只需将其保留在2013年。我在PostGreSQL ODBC驱动程序中遇到了一些数据库。
每个Access数据库中每个表单上的每个函数都应该有一个如下所示的流:
Private Sub btnMyButton_Click()
Dim MyVar as String
On Error GoTo ErrorHappened
'Do some stuff here...
ExitNow:
Exit Sub
ErrorHappened:
MsgBox Err.Description
Resume ExitNow
End Sub
在ErrorHappened部分中,您可以将其写入跟踪错误的表。如果您将所有子功能和功能更改为这样,您应该能够捕获数据库的每个问题。也许写出Err.Number以及Err.Description。
对于其他在Google中遇到这个帖子的人来说,这是导致随机访问崩溃的另外两个原因:
仅仅为了背景,我有一个带有子表单的表单,从服务器上的链表加载数据。
我使用Access 2010.我通过转到文件 - >将对象保存为 - >表单的名称AS REPORT来创建报告(给定表单的真实副本)。在设计视图中打开报表时,在进行一些更改后,我尝试保存更改。访问一直在崩溃。经过好几个小时后,我发现报告中有一些按钮。当我用控制箱替换它们时。就是这样。一切都很好。希望这可以节省一些人宝贵的时间,而且没有任何寻找的迹象。