用access做数据库真头疼啊!!有没有?频繁读写很容易1-2G大了.恐怖!
更奇怪是某些电脑才会.我自己用win2003怎么搞都正常.虚拟机装的XP/win7也正常.不过我都自己装的原版系统.
软件启动或退出时压缩这个我知道.
但在软件运行过程中由于软件功能的原因没法操作压缩.
请教高手,有没好办法??.

解决方案 »

  1.   

    uses Sysutils,ComObj,Dialogs;function DaoActive(var DaoObject:OleVariant):Boolean;
    function DaoCompactDB(const FileName,Pwd: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,Pwd: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,,,';pwd='+Pwd);
          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;应该在DaoActive中检查一下DAO版本,通用性才最强
      

  2.   

    access 好像没这功能吧?
      

  3.   

    +1
    文件型数据库一般删除数据时,只是做个删除标记,实际并无删除,所以文件会越来越大,Access的修复压缩功能就是将这些做了删除标记的数据真正删除,所以在频繁的写数据库时,写操作尽量减少
      

  4.   

    改MSSQL吧。
      

  5.   

    看来的你的程序是常驻程序,不是经常重启。那这样用Access数据库确实就用问题了,改换SQL Server或MySQL吧,不过还是SQL Server比较好一点。MySQL时间长了会断开连接。比较不好控制。改别的数据库只要改一下连接就可以了。代码不一般不需要改动。
      

  6.   

    access数据量小还行,大了不可靠的。
    还是换数据库吧,sqlite或sqlserver
      

  7.   

    断开不怕,不管你的TABLE,还是QUERY,执行时都会判断是否与数据库的连接已断开,如果断开会自动重连,不过肯定会耗费一定的时间
      

  8.   

    我以前都用Access,现在用SQLite