代码之家  ›  专栏  ›  技术社区  ›  Jonas Lincoln

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

  •  4
  • Jonas Lincoln  · 技术社区  · 16 年前

    我在一个客户机上对他们的访问应用程序进行一些快速修复。有一段时间,我有机会进入,但我恢复得很快。然而,我发现了一个有趣的问题:

    对于一些报告,我得到一个“记录被删除”的错误。我查过报告了,好像一张桌子有问题。打开该表时,我会找到一个记录,其中所有列都标记为“已删除”。所以很明显,这一排似乎是罪魁祸首。但是,当我试图删除该行时,实际上什么都没有发生。如果我重新打开表,该行仍然存在。

    数据库是否存在损坏?如何永久删除此记录?

    编辑: 它是MS2000版本

    解决方案: 只是压缩/修复不起作用。我改为将数据库转换为2003文件格式,这就成功了。我已经标记了建议压缩/修复的第一个答案,因为它指出了正确的方向。谢谢!

    5 回复  |  直到 12 年前
        1
  •  4
  •   Ed Harper    16 年前

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

    具体位置因运行的Access版本而异,但在Access 2003上,它位于“工具”>“数据库实用程序”>“压缩和修复数据库”下。一些早期版本的Access有两个独立的工具-一个用于紧凑型,一个用于维修-但它们是从类似的位置访问的。如果它们在客户机拥有的版本上是独立的,则需要同时运行这两个版本。

    这应该是一个非破坏性的操作,但是最好在mdb文件的副本上进行测试(很抱歉声明了明显的错误)。

        2
  •  4
  •   Fionnuala    16 年前

    访问MVP的Tony Toews有一个全面的腐败指南:

    Corrupt Microsoft Access MDBs FAQ

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

    顺便说一下, decompile 对于在编码时整理出奇怪的事件和提高启动时间非常有用。

        3
  •  3
  •   Andy    16 年前

    你也可以试试这个 Command line utility

    安迪

        4
  •  3
  •   HansUp    12 年前

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

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

      Me!txtMyMemo = Me!MyMemo
    

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

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

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

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

        5
  •  2
  •   Gabri    16 年前

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