我用如下代码进行access压缩,为什么几十M的内容都看不到一点变化,而用access里面自带的"修复或压缩"却可以压缩到以前的3/4左右?
var zz:OLEVariant;
begin
datamodule1.adoconnection1.Close;
screen.Cursor:=crHourGlass;
zz:=CreateOleObject('zz.DBEngine.36');
zz.CompactDatabase('capture.mdb','temp.mdb');
DeleteFile('capture.mdb');
RenameFile('temp.mdb','capture.mdb');
datamodule1.adoconnection1.Open;
datamodule1.adotable1.Active:=true;
screen.Cursor:=crDefault;

解决方案 »

  1.   

    改用这一句试试:
    zz:=createoleobject('jro.jetengine');
    注:要用到ComCtrls和JRO_TLB单元
      

  2.   

    推荐你用VCLZIP 很好用 不过D7好象不行
      

  3.   

    jro_tlb找不到阿!是不是要安装什么包?
      

  4.   

    你可以去搜索一下以前的帖子,有关access压缩有很多,JRO_TLB单元要在Import ActiveX
    中导入。
      

  5.   

    以下代码在:Delphi6.0中测试通过。
    原文件:      Main.MDB      大小8.52MB
    压缩后的文件:NewMain.MDB   大小仅为336K,与手工用ACCESS2002压缩的效果一样使用单元:……,Variants,comobj;procedure TForm1.Button1Click(Sender: TObject);
    const
      Provider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
    var
      Myobj:variant;
      NewMdbStr,OldMdbStr:string;
    begin
      NewMdbStr:=Provider+'Data Source=NewMain.Mdb';
      OldMdbStr:=Provider+'Data Source=Main.Mdb';
      MyObj:=createoleobject('jro.jetengine.2.1');
      MyObj.CompactDatabase(OldMDBStr, NewMDBStr);
    end;
      

  6.   

    补充:
        修复压缩数据库时,若出现“类字符串无效”。
        原 因 是:用户计算机中没有或者未注册“MSJRO.DLL”文件。
        解决办法:若$(system)目录中没有上述文件,则复制该文件到$(system)目录下;若$(system)目录有上述文件,那么在$(system)目录下执行下列命令:regsvr32 MSJRO.dll
        若还出现“类字符串无效” 请尝试将“MyObj:=createoleobject('jro.jetengine.2.1');”一句改为:MyObj:=createoleobject('jro.jetengine');
        注:$(system)目录,即为用户计算机中操作系统的系统目录。如:C:\Windows\System” 。(哈,可以结贴给分了吧?!)
      

  7.   

    ,我已经试到了
    请尝试将“MyObj:=createoleobject('jro.jetengine.2.1');”一句改为:MyObj:=createoleobject('jro.jetengine');
    认然对MyObj.CompactDatabase(OldMDBStr, NewMDBStr);这一句提示"指定的初始化字符串不符合ole db规定"
    这是为什么啊?大侠FlyCity(都市飞天) !
    我把你的代码根据我的情况做了如下修改,我觉得这样更完善一些:
    var
    dir:string;
    Myobj:variant;
    NewMdbStr,OldMdbStr:string;
    begin
    dir:=ExtractFilePath(Application.ExeName);
    NewMdbStr:=Provider+'Data Source='+dir+'\temp.mdb';
    OldMdbStr:=Provider+'Data Source'+dir+'\capture.mdb';
    datamodule1.adoconnection1.Close;
    MyObj:=createoleobject('jro.jetengine');
    MyObj.CompactDatabase(OldMDBStr, NewMDBStr);
    DeleteFile('capture.mdb');
    RenameFile('temp.mdb','capture.mdb');
    datamodule1.adoconnection1.Open;
    datamodule1.adotable1.Active:=true;
    end;
      

  8.   

    就你以上问题,我觉得可能跟你机子中的Ole DB的ADO版本支持太低有关,请到Mircsoft网站下载最新的MDAC_TYP.exe升级你的数据服务支持后再试一下。
      

  9.   

    我系统上是MDAC_TYP.exe 2.5版的,根下载的最新版本一样啊!怎么回事?还是不能解决! FlyCity(都市飞天)大侠觉得还有什么可能!
      

  10.   

    ADO所带的压缩对ACCESS版本有一定的要求,你可以改用DAO来解决
      

  11.   

    {***************************************************************
    给你一个DAO维护Access的例子
    *
    ****************************************************************}unit unAccessTools;interfaceuses Sysutils,ComObj,Dialogs;function DaoActive(var DaoObject:OleVariant):Boolean;
    function DaoCompactDB(const FileName:string):Boolean;
    function DaoRepairDB(const FileName:string):Boolean;implementationfunction DaoActive(var DaoObject:OleVariant):Boolean;
    begin
      Result:=False;
      try
        DaoObject:=GetActiveOleObject('DAO.DBEngine.36');
        Result:=True;
      except
        try
          DaoObject:=CreateOleObject('DAO.DBEngine.36');
          Result:=True;
        except
          DaoObject:=Null;
        end;
      end;
    end;//压缩Access数据库
    function DaoCompactDB(const FileName:string):Boolean;
    var
      db:OleVariant;
      TempFile:string;
    begin
      Result:=False;
      try
        if not DaoActive(db) then
          Exit;
        try
          TempFile:=ExtractFilePath(FileName)+'msaTemp.mdb';
          db.CompactDatabase(FileName,TempFile);
          DeleteFile(FileName);
          RenameFile(TempFile,FileName);
          Result:=True;
        except
          on E:EOleException do
            ShowMessage(E.Message);
        end
      finally
        db:=Unassigned;
      end;
    end;//修复Access数据库
    function DaoRepairDB(const FileName:string):Boolean;
    var
      db:OleVariant;
    begin
      Result:=False;
      try
        if not DaoActive(db) then
          Exit;
        try
          db.RepairDatabase(FileName);
          Result:=True;
        except
          on E:EOleException do
            ShowMessage(E.Message);
        end
      finally
        db:=Unassigned;
      end;
    end;end. 
      

  12.   

    csouth(金子),你的方法其实跟我的一样.只是更加规范一些!我已经把你的试过了,还是不能压缩啊!怪事!我数据库中存储的是jpg和bmp的图片,是不是根这有关系?我想应该不会啊!