最好直接用系统的部件,

解决方案 »

  1.   

    function CompactDatabase(AFileName,APassWord:string):boolean;
    //压缩与修复数据库,覆盖源文件
    var
     STempFileName:string;
     vJE:OleVariant;
    begin
     STempFileName:=GetTempPathFileName;
     try
       vJE:=CreateOleObject('JRO.JetEngine');
       vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
           format(SConnectionString,[STempFileName,APassWord]));
       result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
       DeleteFile(STempFileName);
     except
       result:=false;
     end;
    end;
      

  2.   

    vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
           format(SConnectionString,[STempFileName,APassWord]));
    是什么意思啊?CompactDatabase函数怎么用?
      

  3.   

    to JavaD(一竿残照) :可以给我发个实例吗[email protected]
      

  4.   

    我目前在使用的压缩函数,效果不错.
    如果Access不压缩备份,还真不是人用的.操作频繁的时候,一天可以上涨几十M, 压缩一下,就剩下一两M了.//引用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;例子:
    procedure TFAutoStat.ActCompactDBExecute(Sender: TObject);
    var
      sFileName: String;
    begin
      sFileName:=ExtractFilePath(Application.ExeName)+'..\DataBase\AutoStat.mdb';
      sBarText('正在压缩数据库,请稍候......');
      Self.Enabled:=false;
      Self.Cursor:=crSqlWait;
      try
        AdoConnection.Close;
        if  CompactDatabase(sFileName,'abcd')
          then sBarText('压缩数据库完毕')
          else ShowMessage('压缩数据库失败!');
        ConnectToDB();
      finally
        Self.Enabled:=true;
        Self.Cursor:=crDefault;
      end;
    end;
      

  5.   

    Normally compact Access database is pretty easy, while on-line compacting seems  awfully hard, if not impossible.