我写的C/S结构程序数据库用的是.MDB,在运行一段时间后,也就是说在程序中对数据库进行添加/删除等操作后,其容量老是自动增大,我用ACCESS的“工具->修复压缩数据库”后其容量就会减下来,这是怎么回事?如何解决这种现象呢?

解决方案 »

  1.   

    这个是ACCESS的MDB数据库必然会有的现象
    你可以使用OLE调用DAO的enginer对象的方法compact(好象是)
    压缩它 或者可以使用delphi6带的server组件解决
    这个问题问过多次了建议提前多找找资料
      

  2.   

    代码到处都是
    自己找找不好?
    var 
      dbe:olevaraint;
      
      dbe:=createoleobject('DAO.DBEngine.36');
      if assigned(dbe) then
        dbe.compact(老数据库名,新数据库,是否覆盖)
      dbe:=nil;
      

  3.   

    //压缩数据库
    void TForm1::CompactDatabase()
    {
        TCOM_DBEngine Engine=new CoDBEngine->Create();
        WideString BakMDB,SourceMDB,TargetMDB;
        if(Application->MessageBox("数据库压缩是对数据库的一些无用信息进行清除!确保数据的访问速度!现在要做数据库压缩操作吗?", "确认信息",MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION) == IDYES)
        {
            ADOConnection1->Connected=false;
            BakMDB=ExtractFilePath(Application->ExeName)+"BAK\\Diary.mdb";
            SourceMDB=ExtractFilePath(Application->ExeName)+"Diary.mdb";
            TargetMDB=ExtractFilePath(Application->ExeName)+"~TempTarget.dat";
            if(!CopyFile(((AnsiString)SourceMDB).c_str(),((AnsiString)BakMDB).c_str(),0))
            {
                DeleteFile(((AnsiString)TargetMDB).c_str());
                Application->MessageBox("无法进行数据库压缩!","提示信息",MB_OK);
                ADOConnection1->Connected=true;
                return;
            }
            try
            {
                Engine->CompactDatabase(SourceMDB.c_bstr(),TargetMDB.c_bstr());//,"",0,";pwd=123456");
                if(CopyFile(((AnsiString)TargetMDB).c_str(),((AnsiString)SourceMDB).c_str(),0))
                {
                    DeleteFile(((AnsiString)TargetMDB).c_str());
                    Application->MessageBox("数据库压缩成功!","提示信息",MB_OK);
                }
                else
                {
                    Application->MessageBox("数据库压缩失败!","提示信息",MB_OK);
                }
            }
            catch(...)
            {
                ShowMessage("数据库压缩失败!");
            }
        }
        delete Engine;
        ADOConnection1->Connected=true;
    }