前言:
在使用ACCESS数据库的过程中,我们经常会发现,经常做删除操作,会导致数据不断的膨胀,原因就是ACCESS数据库在做删除操作后,并不释放原记录所占用的空间。
由于Jet引擎的限制,执行此方法压缩Access数据库会把结果生成为一个新文件,所以我们要还需要把这个新的Access文件拷贝到目的位置覆盖原来未压缩文件.
当调用此方法时请确认被压缩数据库无打开的连接.
///
/// 修复和压缩ACCESS数据库
///
///
数据库文件的路径
public static void CompactAccessDB(string dbFileDir)
{
//应用程序的路径
string strAppDir = System.AppDomain.CurrentDomain.BaseDirectory;
//数据库的名称
string dbName="DB.mdb";
DirectoryInfo directoryInfo = null;
//用于存放修复和压缩后的ACCESS数据库
string strDataDir = strAppDir + "DBCompatData";
try
{
//判断是否存在目录,不存在就删除
directoryInfo =new DirectoryInfo(strDataDir);
if(directoryInfo.Exists)
Directory.Delete(strDataDir, true);//删除文件
directoryInfo.Create();
//是否存在相同的文件,存在就删除
string compactDbDir = strDataDir +"\\" +dbName;
FileInfo fileStr =new FileInfo(compactDbDir);
if(fileStr.Exists)
System.IO.File.Delete(compactDbDir);
//要压缩的数据库连接串
string sourceConnectionStr = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + dbFileDir + @";User ID=admin;Password=;JET OLEDB:Database Password=100;";
//压缩和修复后数据库的连接串
string destConnectionStr = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + compactDbDir + @";User ID=admin;Password=;JET OLEDB:Database Password=100;JET OLEDB:Engine Type=5";
//创建一个JetEngineClass对象的实例
JRO.JetEngineClass jt = new JRO.JetEngineClass();
//压缩和修复ACCESS数据库
jt.CompactDatabase(sourceConnectionStr, destConnectionStr);
System.IO.File.Copy(compactDbDir, dbFileDir, true);
//删除文件
if (directoryInfo.Exists)
Directory.Delete(strDataDir, true);
}
catch(Exception ex)
{
CCLib.MV.LogTool.WriteEduAppLog(ex.Message, ex.StackTrace);
if (directoryInfo!=null&&directoryInfo.Exists)
Directory.Delete(strDataDir, true);//删除文件
}
}
在此过程中,需要注意的问题:
1: 引用C:\Program Files\Common Files\System\ado\msjro.dll,该DLL包含JRO命名空间
2:无法嵌入互操作类型...请改用适用的接口 解决办法 ,修改的方法为:选中项目中引入的dll,鼠标右键, 选择属性, 把“嵌入互操作类型”设置为False。
3:找不到可安装的 ISAM 主要是数据库连接串,存在问题(例如:Data Source 中间有空格.)。