在处理数据库时,可能会遇到各种问题,其中之一就是数据库文件损坏。本文将探讨导致Access数据库文件损坏的原因,并介绍如何通过编程方法修复这些损坏的文件。
在开发使用Access数据库(.mdb文件)的应用程序时,可能会遇到一些奇怪的行为。例如,在CodeProject C++论坛上提出了一个问题,但没有得到任何回答。通过搜索网络、MSDN等资源,发现问题的原因可能在于数据库文件损坏。MSDN知识库文章提供了关于Access数据库文件损坏可能性的描述:
"有许多内部和外部因素可能导致数据库文件损坏(损坏)。损坏的数据库的症状可能从某些记录中出现#Deleted,到无法打开数据库中的一个对象,到完全无法在Access中打开数据库文件。"
由于在论坛上没有得到问题的答案,认为可能还有一些人不知道这一点,而且MDB文件很容易损坏,但很难理解应用程序为何不正常工作,所以开始写这篇文章。
知识库中提到:
".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。
要使用代码,请按照以下步骤操作:
CDBFitter fitter;
if (!fitter.CompactAndRepair(szDbPath, m_szDBPass)) {
AfxMessageBox(fitter.GetLastErrString());
}
CompactAndRepair有三种形式可供选择使用。上面看到的是第一种,另一种形式仅获取数据库文件路径作为输入,不使用密码。
CompactAndRepair(CString szDbPath)
最后一个要求提供源、目标和密码,可以给出""作为密码,表示没有密码:
CompactAndRepair(CString szSrcDbPath, CString szDstDbPath, CString szDbPassword)
不要忘记在应用程序的初始化中调用AfxOleInit()。
使用C#和Late Binding压缩和修复Access数据库