如何修复可能的数据库损坏?
-
05-07-2019 - |
题
我正在为客户对其访问应用程序进行一些快速修复。我尝试访问已经有一段时间了,但我很快就恢复了。然而,我发现了一个有趣的问题:
对于某些报告,我收到“记录已删除”错误。我检查了报告,似乎有一张表有问题。打开该表时,我发现一条记录,其中所有列都标记为“#deleted”。很明显,这一行似乎是罪魁祸首。但是,当我尝试删除该行时,什么也没有发生。如果我重新打开表,该行仍然存在。
数据库中是否存在损坏?我怎样才能永久删除这个记录?
编辑: 这是MS2000版本
解决方案: 简单地压缩/修复不起作用。我将数据库转换为 2003 文件格式,这样就成功了。我已经标记了建议压缩/修复的第一个答案,因为它为我指明了正确的方向。谢谢!
解决方案
您是否尝试过内置的Access压缩/修复工具?这应该从数据库中刷新已删除的记录。
具体位置根据您正在运行的Access版本而有所不同,但在Access 2003上,它位于工具>下。数据库实用程序>紧凑和修复数据库。一些早期版本的Access有两个独立的工具 - 一个用于紧凑,一个用于修复 - 但是它们是从类似的位置访问的。如果它们在客户端的版本上是分开的,则需要同时运行它们。
这应该是一种非破坏性的操作,但最好在MDB文件的副本上进行测试(对于明显的陈述道歉)。
其他提示
Tony Toews,Access MVP,有一份全面的腐败指南:
损坏的 Microsoft Access MDB 常见问题解答
- 一些腐败症状
- 确定导致损坏的工作站
- 腐败原因
- 检索您的数据
作为旁白, 反编译 对于解决编码时出现的异常情况以及缩短启动时间非常有用。
您也可以尝试命令行实用程序
//安迪
压缩和导入不会解决报告的错误问题,这显然是备注字段的损坏指针。您唯一能做的就是删除并重新创建导致问题的记录。而且你需要找到编辑备忘录数据的方法(或消除备忘录字段 - 你真的需要超过255个字符吗?),这不会让你面临腐败风险。这意味着避免对备注字段的表单进行绑定控制。
相反,使用未绑定的文本框,并在表单的OnCurrent事件中,从表单的基础记录源中分配当前数据:
Me!txtMyMemo = Me!MyMemo
要保存对未绑定控件的编辑,请使用控件的AfterUpdate事件:
Me!MyMemo = Me!txtMyMemo
Me.Dirty = False ' save the whole record
为什么备忘录字段会受到损坏?因为它们不存储在与非备注字段相同的数据页中,而是记录的主数据页中的所有内容都是指向其他数据页的指针(如果它是一大块数据页,则指向一组数据页)数据)存储实际备忘录数据的位置。如果没有这样做,带有备忘录的记录将很快超过最大记录长度。
指针相对容易被破坏,最常见的是在绑定控件中编辑时出现致命问题。使用未绑定控件进行编辑并不能完全消除问题,但意味着您面临危险的时间非常非常短(即,在AfterUpdate事件中执行这两行代码所需的时间)
除了上面已经发布的选项之外,我还使用了另一种简单的方法:只需创建一个新的MDB文件并从损坏的文件中导入所有对象。当你走这条路时,不要忘记获取系统和/或隐藏物品。