解决Access数据库膨胀的问题

来源:互联网 发布:淘宝网中老年羽绒服 编辑:程序博客网 时间:2024/06/05 16:55

   前言:

   在使用ACCESS数据库的过程中,我们经常会发现,经常做删除操作,会导致数据不断的膨胀,原因就是ACCESS数据库在做删除操作后,并不释放原记录所占用的空间。
   由于Jet引擎的限制,执行此方法压缩Access数据库会把结果生成为一个新文件,所以我们要还需要把这个新的Access文件拷贝到目的位置覆盖原来未压缩文件.
   当调用此方法时请确认被压缩数据库无打开的连接.

/// <summary>

/// 修复和压缩ACCESS数据库
/// </summary>
/// <param name="dbFileDir">数据库文件的路径</param>
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 中间有空格.)。