procedure Tmenu_w.N_ysyxfsjkClick(Sender: TObject);
var
  vJE:OleVariant;
  string1,string2,TempFileName,dataFileName:string;
begin
caption:=menu_caption+'-压缩与修复数据库';
StatusBar1.Panels[0].Text:='目前状态:压缩与修复数据库';
login_w.ADOConnection1.connected:=False;
  try
      TempFileName:=ExtractFilePath(Application.ExeName)+'temp.mdb';
      dataFileName:=ExtractFilePath(Application.ExeName)+'syglmisku.mdb';
      string1:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+datafilename+';Jet OLEDB:Database Password=''cxj'';';
      string2:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+TempFileName+';Jet OLEDB:Database Password=''cxj'';';
      vJE:=CreateOleObject('JRO.JetEngine');
      vJE.CompactDatabase(string1,string2);
      CopyFile(PChar(TempFileName),pchar(datafilename),false);
      DeleteFile(TempFileName);
      Application.messagebox('压缩与修复数据库完毕。','提示',MB_ICONINFORMATION);
    except
      login_w.ADOConnection1.connected:=True;
      Application.messagebox('压缩失败。','提示',MB_ICONERROR);
      Exit;
  end;
end;

解决方案 »

  1.   

    参考一下这个,就是分数少了点procedure CompactAccess(dbName: string; JetId: string = '4.0');
    var
      AVariant: Variant;
    begin
      if FileExists(dbName + '.tmp') then DeleteFile(DbName + '.tmp'); //是否存在相同的.tmp的临时文件,有则删了
      AVariant := CreateOleObject('JRO.JetEngine');
      AVariant.CompactDataBase('Provider=Microsoft.Jet.OLEDB.' + JetId + ';Jet OLEDB:Database Password=hjp;Data Source=' +
        dbName,
        'Provider=Microsoft.Jet.OLEDB.' + JetId + ';Data Source=' + dbName + '.tmp');
      DeleteFile(DbName);
      ReNameFile(dbName + '.tmp', DbName); //把文件名改回来
    end;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.   

    进行压缩修复时,请关闭其它连接或访问此mdb的程序,不然后面复制删除会出错.
      

  3.   

    这代码到处都有,这个压缩我也试了好久就是不行,如果ACCESS2000以下的版本倒是可以,2000以上的则是不可以的