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

时间:2008-10-30 10:51:08

标签: database ms-access corruption database-integrity

我正在客户端为他们的访问应用程序做一些快速修复。我有一段时间可以访问,但我正在快速恢复。但是,我发现了一个有趣的问题:

对于某些报告,我收到“记录已删除”错误。我检查了报告,似乎有一个表有问题。打开该表时,我找到一条记录,其中所有列都标记为“#deleted”。显然,这一行似乎是罪魁祸首。但是,当我尝试删除该行时,没有任何实际发生。如果我重新打开表,该行仍然存在。

数据库中是否存在损坏?如何才能删除此记录?

编辑:这是MS2000版本

解决方案:简单压缩/修复无法正常工作。我改为将数据库转换为2003文件格式,这就是诀窍。我已经标出了第一个建议压缩/修复的答案,因为它指出了我正确的方向。谢谢!

5 个答案:

答案 0 :(得分:4)

您是否尝试过内置的Access压缩/修复工具?这应该从数据库中刷新已删除的记录。

具体位置根据您正在运行的Access版本而有所不同,但在Access 2003上,它位于工具>下。数据库实用程序>紧凑和修复数据库。一些早期版本的Access有两个独立的工具 - 一个用于紧凑,一个用于修复 - 但是它们是从类似的位置访问的。如果它们在客户端的版本上是分开的,则需要同时运行它们。

这应该是一种非破坏性的操作,但最好在MDB文件的副本上进行测试(对于明显的陈述道歉)。

答案 1 :(得分:4)

Access MVP Tony Toews有一份全面的腐败指南:

Corrupt Microsoft Access MDBs FAQ

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

除此之外,decompile对于在编码和改善启动时间时排除奇怪事件非常有用。

答案 2 :(得分:3)

你也可以尝试这个Command line utility

//安迪

答案 3 :(得分:3)

压缩和导入不会解决报告的错误问题,这显然是备注字段的损坏指针。您唯一能做的就是删除并重新创建导致问题的记录。而且你需要找到编辑备忘录数据的方法(或消除备忘录字段 - 你真的需要超过255个字符吗?),这不会让你面临腐败风险。这意味着避免对备注字段的表单进行绑定控制。

相反,使用未绑定的文本框,并在表单的OnCurrent事件中,从表单的基础记录源中分配当前数据:

  Me!txtMyMemo = Me!MyMemo

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

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

为什么备忘录字段会受到损坏?因为它们不存储在与非备注字段相同的数据页中,而是记录的主数据页中的所有内容都是指向其他数据页的指针(如果它是一大块数据页,则指向一组数据页)数据)存储实际备忘录数据的位置。如果没有这样做,带有备忘录的记录将很快超过最大记录长度。

指针相对容易被破坏,最常见的是在绑定控件中编辑时出现致命问题。使用未绑定控件进行编辑并不能完全消除问题,但意味着您面临危险的时间非常非常短(即,在AfterUpdate事件中执行这两行代码所需的时间)

答案 4 :(得分:2)

除了上面已经发布的选项之外,我还使用了另一种简单的方法:只需创建一个新的MDB文件并从损坏的文件中导入所有对象。当你走这条路时,不要忘记获取系统和/或隐藏物品。