编程修复损坏的Access数据库文件

在处理数据库时,可能会遇到各种问题,其中之一就是数据库文件损坏。本文将探讨导致Access数据库文件损坏的原因,并介绍如何通过编程方法修复这些损坏的文件。

在开发使用Access数据库(.mdb文件)的应用程序时,可能会遇到一些奇怪的行为。例如,在CodeProject C++论坛上提出了一个问题,但没有得到任何回答。通过搜索网络、MSDN等资源,发现问题的原因可能在于数据库文件损坏。MSDN知识库文章提供了关于Access数据库文件损坏可能性的描述:

"有许多内部和外部因素可能导致数据库文件损坏(损坏)。损坏的数据库的症状可能从某些记录中出现#Deleted,到无法打开数据库中的一个对象,到完全无法在Access中打开数据库文件。"

由于在论坛上没有得到问题的答案,认为可能还有一些人不知道这一点,而且MDB文件很容易损坏,但很难理解应用程序为何不正常工作,所以开始写这篇文章。

知识库中提到:

".mdb文件可能因以下三个主要原因而损坏:
  • 中断的写操作
  • 故障的网络硬件
  • 在另一个程序中打开和保存.mdb文件

知识库中对每个原因都有详细描述,但一些重要原因如下:

  • 在数据库写入过程中断电
  • 网络连接中断
  • Microsoft Jet连接异常终止,例如使用任务管理器关闭应用程序、断电、手动关闭(注意:致命系统错误几乎总是导致异常终止,请参阅知识库以获取更多信息)
  • 忘记关闭打开的ADO或DAO对象(来自类的对象,如Recordset、QueryDef、TableDef和Database)
  • 在循环中进行大量打开和关闭操作(超过40,000次连续打开和关闭操作可能导致损坏)
  • 最糟糕的是,在另一个程序(如Microsoft Word)中打开和保存.mdb文件。这是不可恢复的。所有数据都将丢失。
"没有办法恢复在另一个程序中打开然后保存的.mdb文件"

避免上述所有情况,并经常压缩数据库(本文提供类):

  • 避免上述所有情况
  • 经常压缩数据库

在压缩和修复数据库后,AutoNumber字段可能会重复之前的值:

"在压缩和修复数据库后,AutoNumber字段可能会重复之前的值,如果它是数据库键,那么..."

幸运的是,这仅适用于使用Microsoft Jet版本4.0.2927.4及更早版本的人。"Microsoft已确认这是Microsoft Jet版本4.0.2927.4及更早版本的问题。"(Microsoft KB Q291162)。要找到Jet引擎版本,请尝试在system/32目录中搜索Msjet40.dll(如果使用的是版本4及更高版本),然后获取文件的属性。这个知识库可以帮助找到版本并下载最新版本:Q239114。

使用代码

要使用代码,请按照以下步骤操作:

  1. 将DBFitter.cpp和DBFitter.h复制到项目中。
  2. 检查并可能更改DBFitter.cpp中前两个#import指令。
  3. 包括DBFitter.h,创建一个DBFitter类型的对象,并按如下方式使用它:
CDBFitter fitter; if (!fitter.CompactAndRepair(szDbPath, m_szDBPass)) { AfxMessageBox(fitter.GetLastErrString()); }

CompactAndRepair有三种形式可供选择使用。上面看到的是第一种,另一种形式仅获取数据库文件路径作为输入,不使用密码。

CompactAndRepair(CString szDbPath)

最后一个要求提供源、目标和密码,可以给出""作为密码,表示没有密码:

CompactAndRepair(CString szSrcDbPath, CString szDstDbPath, CString szDbPassword)

不要忘记在应用程序的初始化中调用AfxOleInit()。

在运行Compact和Repair工具之前要确保的事项

  • 确保硬盘上有足够的空闲存储空间来存储原始和压缩后的Access数据库。这意味着必须有足够的空闲存储空间来存储至少两倍大小的Access数据库。如果需要释放一些空间,请从该驱动器中删除任何不需要的文件,或者如果可能的话,将Access数据库移动到有更多空闲空间的驱动器上。
  • 确保拥有Access数据库的Open/Run和Open Exclusive权限。如果拥有数据库,请确保设置这些权限。如果不拥有数据库,请联系其所有者以了解是否可以获得这些权限。
  • 确保没有用户打开Access数据库
  • 确保Access数据库不在只读网络共享上,或者其文件属性没有设置为只读。
使用C#和Late Binding压缩和修复Access数据库
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485