如何用Delphi压缩Access数据库?在我的程序里我把Access库中的表删掉之后它的大小还是不变,在Access中我知道怎么压缩,可是我现在要用程序来压缩它,请问各位大虾如何做,谢谢!!

解决方案 »

  1.   

    使用ado吗?
    请看:
      try
       dtmd.ADOConnection1.Connected:=false;
       CompactAndRepair(DTMD.MyappPath+'\DATA\'+dtmd.CurDb,DTMD.MyappPath+'\DATA\GasIS~1.mdb');
       deletefile(DTMD.MyappPath+'\DATA\'+dtmd.CurDb);
       renamefile(DTMD.MyappPath+'\DATA\GasIS~1.mdb',DTMD.MyappPath+'\DATA\'+dtmd.CurDb);
       dtmd.ADOConnection1.Connected:=true;
       messagedlg('压缩整理成功!',mtinformation,[mbok],0);
      except
       showmessage('数据库正在被其他应用程序打开,请稍后再试!');
      end;
      

  2.   

    Function CompactAndRepair(sOldMDB : String; sNewMDB : String) : Boolean;
    const
             sProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
    var
             oJetEng   : JetEngine;
    begin
             sOldMDB := sProvider + 'Data Source=' + sOldMDB;
             sNewMDB := sProvider + 'Data Source=' + sNewMDB;         try
                oJetEng := CoJetEngine.Create;
                oJetEng.CompactDatabase(sOldMDB, sNewMDB);
                oJetEng := Nil;
                Result  := True;
             except
                oJetEng := Nil;
                Result  := False;
             end;
    end;
      

  3.   

    uses ComObj;
    //压缩包括修复功能
    procedure CompactMDB(const DBName: string);
    var
      sTmp: string;
      DaoObj: OleVariant;
    begin
      sTmp := Copy(DBName, 1, LastDelimiter('\', DBName)) + 'Temp.mdb';
      try
        try
          DaoObj := CreateOleObject('DAO.DBEngine.36');
          DaoObj.CompactDatabase(DBName, sTmp);
          DeleteFile(DBName);
          RenameFile(sTmp, DBName);
        except
        end;
      finally
        DaoObj := Unassigned;
      end;
    end;
      

  4.   

    同时用install compnent 将JRO_TLB.DCU引入
    位于c:\program files\borland\delphi7\imports
      

  5.   

    procedure TCommDatas.CompactDB(dbname,pw:string);//dbname:文件名  pw:密码
    var
       s1,s2,s3:WideString;
       v1,v2:Variant;
       O:_DBEngine;
    begin
       s1:=dbname;
       s2:='tempdb$$.$$$';
       if pw='' then
          s3:=''
       else
          s3:=';pwd='+pw;
       v1:=Variant('');
       v2:=Variant(0);   O:=CoDBEngine.Create();
       O.CompactDataBase(s1,s2,v1,v2,Variant(s3));
       if (DeleteFile(dbname)) then
          RenameFile('tempdb$$.$$$',dbname);
    end;
      

  6.   

    1.DELPHI中操作ACCESS数据库(建立.mdb文件,压缩数据库)
    以下代码在WIN2K,D6,MDAC2.6下测试通过,
    编译好的程序在WIN98第二版无ACCESS环境下运行成功.
    //在之前uses ComObj,ActiveX
    //声明连接字符串
    Const
     SConnectionString       = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
                                   +'Jet OLEDB:Database Password=%s;';//=============================================================================
    // Procedure: GetTempPathFileName
    // Author   : ysai
    // Date     : 2003-01-27
    // Arguments: (None)
    // Result   : string
    //=============================================================================
    function GetTempPathFileName():string;
    //取得临时文件名
    var
     SPath,SFile:array [0..254] of char;
    begin
     GetTempPath(254,SPath);
     GetTempFileName(SPath,'~SM',0,SFile);
     result:=SFile;
     DeleteFile(PChar(result));
    end;//=============================================================================
    // Procedure: CreateAccessFile
    // Author   : ysai
    // Date     : 2003-01-27
    // Arguments: FileName:String;PassWord:string=''
    // Result   : boolean
    //=============================================================================
    function CreateAccessFile(FileName:String;PassWord:string=''):boolean;
    //建立Access文件,如果文件存在则失败
    var
     STempFileName:string;
     vCatalog:OleVariant;
    begin
     STempFileName:=GetTempPathFileName;
     try
       vCatalog:=CreateOleObject('ADOX.Catalog');
       vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
       result:=CopyFile(PChar(STempFileName),PChar(FileName),True);
       DeleteFile(STempFileName);
     except
       result:=false;
     end;
    end;//=============================================================================
    // Procedure: CompactDatabase
    // Author   : ysai
    // Date     : 2003-01-27
    // Arguments: AFileName,APassWord:string
    // Result   : boolean
    //=============================================================================
    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;//=============================================================================
    // Procedure: ChangeDatabasePassword
    // Author   : ysai
    // Date     : 2003-01-27
    // Arguments: AFileName,AOldPassWord,ANewPassWord:string
    // Result   : boolean
    //=============================================================================
    function ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
    //压缩数据库并修改ACCESS数据库密码
    var
     STempFileName:string;
     vJE:OleVariant;
    begin
     STempFileName:=GetTempPathFileName;
     try
       vJE:=CreateOleObject('JRO.JetEngine');
       vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassWord]),
           format(SConnectionString,[STempFileName,ANewPassWord]));
       result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
       DeleteFile(STempFileName);
     except
       result:=false;
     end;
    end;