ms-accessms-access-2007ado

Why is my Access 2007 database growing so much?


I work on a Win32 application that has developed a very strange problem of the database quietly growing until finally it reaches the 2 GB file size limit. We use ADO to connect to an Access 2007 database. The application has worked nicely for years with no such difficulty being observed. as you may imagine, when it reaches the 2 GB limit, the database becomes corrupt. I have quite a few customer databases now that were sent to us for repair--all around 2GB in size. once compacted, they come back to < 10 MB.

we see some database growth over time but never growth on that sort of scale.

I made a small database "checker" that adds up the contents of all fields in all records to give some idea how much actual data is present. having checked this new tool on databases that have recently been compacted, I think the tool is working correctly. all the bloated databases have not more than 10 MB of data each.

We don't compact the database at app start. It has seemed to me that because we don't delete large amounts of data, compacting the database isn't something we "should" need to do. customers with larger databases (there are some but they are on earlier versions).

Can you suggest how we could have a database that should be <10 MB could grow to 2 GB?

A few remarks about what our app does:

thank you for any insights you can offer.


Solution

  • thank you all for your help. found where it happened:

    var
      tbl:ADOX_TLB.Table;
      cat:ADOX_TLB.Catalog;
      prop:ADOX_TLB.Property_;
    begin
      cat:=ADOX_TLB.CoCatalog.Create;
    
      cat.Set_ActiveConnection(con.ConnectionObject);
    
      // database growth here
      tbl:=cat.Tables.Item[sTableName];
    
      prop:=tbl.Properties['ValidationText'];
    
      Result:=prop.Value;
    
      prop:=nil;
      tbl:=nil;
      cat:=nil;
    end;
    

    each time this function was called, the database grew by about 32KB.

    i changed to do this function less often and do it with DAO instead of ADO.