最近写程序用到access数据库,运行不久就发觉速度很慢,后来察觉是数据库文件太大有100多兆,
所以想方设法在程序中即时清理无用记录,但用不了多久这个数据库文件又大到100M多兆。几经
周折才发现原来access中有一个“数据压缩”的菜单命令,压缩后,100多兆文件变为3兆多。现在的问题是压缩后3兆多的文件不久又变到100多兆。而真正存的记录绝没有那么大。
请问有没有什么方法用代码实现自动压缩,或达到此目的的别的方法?
谢谢各位同行。

解决方案 »

  1.   

    在uses里加上 ComObj,ActiveX ;
     uses ComObj,ActiveX ;
    function CompactDatabase(AFileName,APassWord:string):boolean;
    //压缩与修复数据库,覆盖源文件
    const
      SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
          +'Jet OLEDB:Database Password=%s;';
    var
      SPath,SFile:Array [0..254] Of Char;
      STempFileName:String;
      JE:OleVariant;
    begin
      GetTempPath(40,SPath);//取得Windows的Temp路径
      GetTempFileName(SPath,'~CP',0,SFile);//取得Temp文件名,Windows将自动建立0字节文件
      STempFileName:=SFile;//PChar->String
      DeleteFile(STempFileName);//删除Windows建立的0字节文件
      try
        JE:=CreateOleObject('JRO.JetEngine');//建立OLE对象,函数结束OLE对象超过作用域自动释放
        OleCheck(JE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
            format(SConnectionString,[STempFileName,APassWord])));//压缩数据库
        //复制并覆盖源数据库文件,如果复制失败则函数返回假,压缩成功但没有达到函数的功能
        result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
        DeleteFile(STempFileName);//删除临时文件
      except
        result:=false;//压缩失败
      end;
    end;
      

  2.   

    谢谢ksaiy(消失在人海)