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;
  vJE:OleVariant;
 begin
  GetTempPath(40,SPath);//取得Windows的Temp路径
  GetTempFileName(SPath,'~CP',0,SFile);//取得Temp文件名,Windows将自动建立0字节文件
  STempFileName:=SFile;//PChar->String
  DataTxRx.adoconnection1.ConnectionString:='';
  DeleteFile(STempFileName);//删除Windows建立的0字节文件
 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;

解决方案 »

  1.   

    实际上就是调用了Jet引擎的方法进行压缩,给一段参考代码//压缩Access db
    procedure CompactAccessDB(ADbFile: string);
    const
      FileNameTmp = 'temp.db';
      JetConnStr = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;';
    var
      JetEngine: OleVariant;
      ConnStr, ConnStrTmp: string;
      f: file of Byte;
    begin
    //关闭数据库连接  AssignFile(f, ADbFile);
      Reset(f);
      try
        ShowInfo('文件大小:' + FormatFloat('0.##', FileSize(f)/1048576)+ 'M', false);
      finally
        CloseFile(f);
      end;  ConnStr := Format(JetConnStr, [ADbFile]);
      ConnStrTmp := Format(JetConnStr, [GetEnvironmentVariable('TEMP') + '\' + FileNameTmp]);
      try
        JetEngine := CreateOleObject('JRO.JetEngine');
        JetEngine.CompactDatabase(ConnStr, ConnStrTmp);
        CopyFile(PChar(FileNameTmp), PChar(ADbFile), false);
        DeleteFile(FileNameTmp);
      finally
        JetEngine := Unassigned;
      end;  AssignFile(f, ADbFile);
      Reset(f);
      try
        ShowInfo('压缩后文件大小:' + FormatFloat('0.##', FileSize(f)/1048576)+ 'M', false);
      finally
        CloseFile(f);
      end;
    end;
      

  2.   


    我上面已经删除连接了啊!!!
    DataTxRx.adoconnection1.ConnectionString:=''; 
      

  3.   


    这个不叫删除连接,你只是删除了连接字符串而已。
    试试DataTxRx.adoconnection1.active:=false;
      

  4.   

    begin//关闭数据库连接  AssignFile(f, ADbFile);
      Reset(f);
      try
        ShowInfo('文件大小:'+ FormatFloat('0.##', FileSize(f)/1048576)+'M', false);
      finally
        CloseFile(f);end;  这个是关闭数据库连接吧?我怎么看不懂啊?
    嘿嘿,,不好意思啊!!
    好人,你就解释一下吧!!
      

  5.   


    那用close算停止他工作了吧?
    还是不行啊!!
      

  6.   

    DataTxRx.adoconnection1.Active := false;

    DataTxRx.adoconnection1.Close;
      

  7.   

    嘿嘿,,这个是好了,可是为什么我的cpu使用率一直都很高啊?忽高忽低的!!
    库里面有十多万条的数据