如何调查和解决(明显的)Access 数据库损坏?
Posted
技术标签:
【中文标题】如何调查和解决(明显的)Access 数据库损坏?【英文标题】:How can I investigate and resolve an (apparent) Access database corruption? 【发布时间】:2014-12-13 06:56:47 【问题描述】:我有一个前端和后端分离的 Microsoft Access 2010 数据库应用程序,它的行为开始出现异常,我已经用尽了所有我知道的用于调查和解决问题的选项。
在 Windows 8.1 上运行的 32 位 Access 2010... 我同时安装了 Access 2010 和 Access 2013,但问题也出现在 Windows 8.1 系统上,该系统安装了全新的 Access 2010 并且没有 Office 2013。如果应用程序使用 Access 2010 Runtime 运行,也会存在此问题。前端在我的硬盘上运行,而不是在 Dropbox 或类似环境中。后端在 Dropbox 中。
应用程序中有几个第三方元素 - 参考如图所示 - 示例 1 在同时存在 Access 2010 和 2013 的系统上,示例 2 在仅存在 Access 2010 的系统上。
自 2013 年 12 月以来,Treeview 控件没有软件更新。我检查了我使用的第三方控件的版本是否与 Windows 8.1 兼容。
症状:
该应用程序(未发布的开发版本)最初运行良好,但如果关闭并重新打开,一个特定操作(右键单击主窗体上的第三方树形视图 ActiveX 控件)行为异常——触发了右键单击事件多次而不是一次(次数是不可预测的)。主窗体上有两个具有相同设置的树视图(使用不同的数据集动态填充)。一个树视图的行为,一个没有。即使我从右键单击事件中删除所有代码,它也会触发两次。
这个主窗体配置和代码一年多没有改变,没有树视图配置或代码。我不在关闭时使用 Compact。应用程序没有记录任何错误。
我的尝试:
如果我恢复以前版本的应用程序,它可以工作......重新打开时,它就不能工作。 (我已经在几个以前版本的数据库中尝试过。)
我尝试从旧的工作版本的数据库中导入主表单的副本——同样的问题。
我已经尝试删除有故障的树视图并创建一个新的(复制正在工作的)——同样的问题。
我尝试创建一个新的空白数据库并从旧数据库中导入所有对象。一旦我手动恢复了引用,同样的问题。
我已经查看了 Can't eliminate Access corruption 中提到的所有可能性——我对这个问题的一个共同点是我(过去三个月)开始使用 VBA Implements
关键字,但是在问题出现之前我没有对这段代码进行任何更改,主窗体和树视图控件都没有使用它。
我已通过电子邮件向支持团队发送了有关树视图控件的信息,但他们没有任何建议表明我尚未尝试过。
我已经修复了 Access 2010 和 Office 365 的安装,以防引用被弄乱了。
我已经卸载了 Office 365 和 Access 2010,重新启动机器并重新安装了 Access 2010。引用都是 Office 14 引用,并且问题仍然存在(在编译的 accde 中)。重新安装 Office 365 后,引用变为混合 14 和 15。(对于已有两年的工作版本也是如此)。
我还没有尝试过的:
回滚两个月的 Windows 更新,看看是否是 Windows 问题(该系统自 9 月初才开始使用,因此尝试起来不会非常繁重)。
回滚到 2012 年 12 月(最后一个生产版本)的应用版本,该版本似乎没有遭受损坏,并手动重新应用近两年的开发更改。这将是一项艰巨的任务......
还有其他可供我尝试的调查或解决方案吗?
编辑添加:最终奏效
我创建了一个新的空数据库,从旧数据库中导入了所有内容除了主窗体,我从头开始重新创建它以看起来与旧数据库相同并且具有相同的代码......并且问题已经消失。它作为一个解决方案不是很令人满意,但它似乎证实了某处存在损坏。
【问题讨论】:
您发布的屏幕截图已经显示出混乱的参考。您不可能在进行所有这些故障排除时没有注意到您的参考资料中有办公室 14 和 15 参考资料。我会首先解决这个问题。所以在控制面板程序和功能中,需要选择office 14安装。然后进行维修。 (不要启动或使用 office 15)。您确实“超出”了能力范围,您进行了大量的故障排除,但甚至没有费心阅读或指出或解决在您的屏幕截图中可以清楚地看到的混淆 14 和 15 个办公室参考的问题。 @AlbertD.Kallal 感谢您的客气话。引用确实看起来很奇怪,这就是为什么我在从未安装过 Office 2013 的系统上运行应用程序(没有更改)的原因。只有 Office 14 引用存在/显示 - 问题仍然存在。 @AlbertD.Kallal 我已编辑问题以在第二个系统上添加参考图像。 我会尝试隔离组件。首先从等式中删除保管箱 - 将后端放在您的驱动器上并重新链接表格。你说你尝试了以前的版本但它不起作用,所以我倾向于关注任何外部的东西——硬件/软件/dropbox/ActiveX 控件/等等。我想你只提到你有 7.0 版的 SftTree/OCX ,但是您是否查看过用于该控件的 Hot Fixes 和点发布(请参阅softelvdm.com/Support/ActiveXControls/…) - 即 Windows 8.1 支持在 7.08 @ColeValleyGirl,这篇文章做得很好,祝贺你解决了这个问题。我会敦促您进行最终更新,将其用作答案,然后接受答案(您可能需要等待 1-3 天才能完成该步骤)。这对各方都有帮助。 【参考方案1】:在 Access 数据库中消除损坏的最佳方法之一是使用未记录的 SaveAsText
函数将表单和报表保存为文本,删除表单和报表对象,关闭数据库,使用未记录的 /decompile
开关反编译数据库,压缩/修复数据库,然后使用未记录的LoadFromText
函数重新导入所有对象。
【讨论】:
【参考方案2】:通常,Access 数据库损坏会影响 VBA 模块,不太可能影响表数据。因此,希望您能够将数据复制到空白数据库,从较旧的备份中获取 VBA 代码(自上次源代码更新以来)并将两者合并在一起。它应该工作!
【讨论】:
可以轻松进入评论 你会从 Q 的底部看到这基本上就是我所做的。【参考方案3】:除非您禁用更新,否则它不会保持不变。而且您不能禁用更新,因为您会损害安全性。
【讨论】:
很遗憾有人没有足够的信息来投票反对。以上是关于如何调查和解决(明显的)Access 数据库损坏?的主要内容,如果未能解决你的问题,请参考以下文章