如何修复可能的数据库损坏?

4
我在客户那里为他们的访问应用程序进行一些快速修复。我已经很久没有使用Access了,但是我正在迅速恢复。然而,我发现了一个有趣的问题:
对于某些报告,我会收到“记录已删除”的错误消息。我已经检查了这些报告,看起来有一个表格出了问题。当我打开该表格时,我发现一个记录中所有列都标记为“#deleted”。所以显然,这一行似乎是罪魁祸首。然而,当我尝试删除该行时,什么也没有发生。如果我重新打开表格,则该行仍然存在。
数据库是否损坏?如何永久删除此记录?
编辑:这是MS2000版本
解决方案:简单的压缩/修复无效。我将数据库转换为2003文件格式,这解决了问题。我标记了第一个建议压缩/修复的答案,因为它指导了我正确的方向。谢谢!

我为这个问题添加了一些标签,以便于其他人在未来更容易找到它。如果您认为它们不合适,请随意删除它们。 - Onorio Catenacci
我记得 MSA-2000 中存在一个类似的 bug,唯一或者说最简单的解决方法是将其升级到 2003 版本并进行压缩修复。从那里开始,如果需要的话,你总是可以将它转换回 2000 版本。 - BIBD
5个回答

4
您尝试过内置的Access压缩/修复工具吗?这可以清除数据库中已删除的记录。
具体位置因您使用的Access版本而异,但在Access 2003上,它位于“工具”>“数据库实用程序”>“压缩和修复数据库”下。早期版本的Access有两个单独的工具-一个用于压缩,一个用于修复-但是它们从类似的位置访问。如果它们在客户端的版本上是分开的,则需要同时运行两个工具。
这应该是一种非破坏性操作,但最好在MDB文件的副本上进行测试(抱歉,这是显而易见的)。

4

Tony Toews,Access MVP,有一份全面的损坏指南:

Corrupt Microsoft Access MDBs FAQ

  • 一些损坏症状
  • 确定导致损坏的工作站
  • 损坏原因
  • 检索您的数据

另外,反编译在编码时解决奇怪情况和提高启动时间方面非常有用。


我完全忘记了托尼的东西。谢谢! - Mitch Wheat
我也可以推荐反编译建议。 - Mitch Wheat

3
压缩和导入不会解决报告的错误问题,这显然是一个备忘录字段的损坏指针。你唯一能做的就是删除并重新创建导致问题的记录。而且你需要找到一些编辑备忘录数据的方法(或消除备忘录字段——你真的需要超过255个字符吗?),这些方法不会让你面临损坏风险。这意味着要避免在表单上使用备忘录字段的绑定控件。
相反,使用一个未绑定的文本框,并在表单的OnCurrent事件中,将当前数据分配给表单的基础记录源:
  Me!txtMyMemo = Me!MyMemo

要保存对未绑定控件的编辑,请使用该控件的AfterUpdate事件:

  Me!MyMemo = Me!txtMyMemo
  Me.Dirty = False        ' save the whole record

为什么备忘录字段容易损坏?因为它们不存储在与非备忘录字段相同的数据页中,而是,记录的主要数据页中只有指向实际备忘录数据所存储的某个其他数据页(或一组数据页,如果数据量很大)的指针。如果不是这样做,带有备忘录的记录将很快超过最大记录长度。
这个指针很容易被损坏,通常是由于绑定控件编辑期间发生致命问题。使用未绑定控件进行编辑并不能完全消除问题,但意味着您暴露于危险之中的时间非常短(即,在AfterUpdate事件中执行那两行代码所需的时间)。

3

2

除了以上已发布的选项外,我还使用了另一种简单的方法:只需创建一个新的MDB文件,并从损坏的文件中导入所有对象即可。在这种方式下,请不要忘记获取系统和/或隐藏对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接