procedure TMail.Timer1Timer(Sender: TObject);
var
 Filename:string;
 dbe:OleVariant;
 te,tp:string;
begin
  Filename:=Formatdatetime('yyyy年mm月dd日',now)+Formatdatetime('hh',inchour(now,-2))+'点.tbf';
  te:=extractfiledir(application.exename)+'\data\ppsy.mdb' ;
  tp:=extractfiledir(application.exename)+'\databak\'+formatdatetime('yyyy年mm月dd日hh点',now)+'.tbf';  if  (bak=1) and (formatdatetime('nn',now)='00') then
   dbe:=CreateOleObject('dao.dbengine.36');
   dbe.CompactDatabase(te,tp,'',0,'');//实用时加密码;pwd=007408  if (bak=30) and (formatdatetime('nn',now)='30') then
   dbe:=CreateOleObject('dao.dbengine.36');
   dbe.CompactDatabase(te,tp,'',0,'');//实用时加密码;pwd=007408Deletefile(ExtractFilePath(Application.ExeName)+'databak\'+Filename);
end;编译顺利通过,但执行时出错了.

解决方案 »

  1.   

    停在这句了 dbe.CompactDatabase(te,tp,'',0,'');
      

  2.   

    俺是用JRO做清理:function Tfrm_QAK_Backup.RepairByJRO(): boolean;  // 调用 JRO 压缩库文件
    var
      oleObject: OleVariant;
      srcQAK, tmpQAK, bakQAK: string;
    begin
      Screen.Cursor := crSQLWait;  srcQAK := _DIR_APP + 'QAK.MDB';
      bakQAK := _DIR_APP + 'QAK_BAK.MDB';
      tmpQAK := _DIR_APP + 'QAK_Tmp.MDB';
      if FileExists(bakQAK) then DeleteFile(bakQAK);
      CopyFile(PChar(srcQAK),PChar(bakQAK),False);  // 做个备份,用语压缩出错误时恢复  try
        try
          oleObject:= createoleobject('JRO.JetEngine');
          oleObject.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + srcQAK + ';Jet OLEDB:Database Password=' + _PSW_ACCESS + ';','Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + tmpQAK + ';Jet OLEDB:Database Password=' + _PSW_ACCESS + ';');      Sleep(2000);  // 延时 2 秒
          DeleteFile(srcQAK);
          RenameFile(tmpQAK,srcQAK);
          Result := True;
        except
          on EE: Exception do begin
            Application.MessageBox(PAnsiChar('整理数据库文件失败,错误: ' + #13#13#10 + EE.Message),'YGQA 提示',16);
            Result := False;
          end;
        end;
      finally
        oleObject := UnAssigned;
      end;  Screen.Cursor := crDefault;
    end;
      

  3.   

    俺比较过,用dao不如jro可靠,特别是不同的MDAC_Type时。俺的系统可以在98/2000/me/xp/Vista下做
      

  4.   

    从楼主代码的缩进格式来看,应该是缺少了两组begin...end。
    结果就造成了不管判断的条件是否成立,dbe.CompactDatabase(te,tp,'',0,'')总是会被执行,而执行时有可能dbe并未实例化。  ......
      if  (bak=1) and (formatdatetime('nn',now)='00') then
      begin
        dbe:=CreateOleObject('dao.dbengine.36');
        dbe.CompactDatabase(te,tp,'',0,'');//实用时加密码;pwd=007408
      end;  if (bak=30) and (formatdatetime('nn',now)='30') then
      begin
        dbe:=CreateOleObject('dao.dbengine.36');
        dbe.CompactDatabase(te,tp,'',0,'');//实用时加密码;pwd=007408
      end;  Deletefile(ExtractFilePath(Application.ExeName)+'databak\'+Filename);
    end;