Avatar billede poulsgaard Praktikant
16. november 2001 - 13:29 Der er 9 kommentarer og
2 løsninger

Komprimering af access database

Jeg har lavet et program der bruger en access database via TDatabase, TTabel osv.

Efterhånden som jeg skriver og sletter poster vokser databasen støt og roligt. Der er en funktion i MS-Access der komprimere database. Nu mangler jeg en ligende funktion til mit program. Findes den allerede, skal jeg bruge en anden komponent eller hu??
Avatar billede morten_s Nybegynder
16. november 2001 - 13:31 #1
Er der ikke en SQL kommando som du kan skyde afsted som foretager den pågældende funktion ?
Avatar billede poulsgaard Praktikant
16. november 2001 - 13:33 #2
Morten s-> Aner det ikke, skal jeg oprette et spørgsmål mere ??

;-))

Ok, jeg kigger..
Avatar billede morten_s Nybegynder
16. november 2001 - 13:42 #3
Har du ikke manualen ?


  var
    QueryCompress : TQuery;

begin
  QueryCompress := TQuery.Create(Self);
  with QueryCompress do
  begin
    Database := DinDB;
    DisableControls
    SQL.Clear
    SQL.Add(\'DenSQL streng som skal til for at komprimere\');
    ExecSql;
    EnableControls;
    free;
  end;
end;
Avatar billede poulsgaard Praktikant
16. november 2001 - 13:47 #4
SQL.Add(\'DenSQL streng som skal til for at komprimere\');

Jamen det er jo så den jeg spørger efter ;-)
Avatar billede morten_s Nybegynder
16. november 2001 - 13:49 #5
Måske du skal spørge under Acess forumet
Avatar billede morten_s Nybegynder
16. november 2001 - 14:09 #6
Jamen selv tak for hjælpen ;-))
Avatar billede poulsgaard Praktikant
16. november 2001 - 14:10 #7
sorry- Morten tak skal du have
Avatar billede stoney Nybegynder
16. november 2001 - 14:18 #8
Dette er en kodestump jeg engang fandt

Jeg har ikke testet det

You can import the MS JRO type library and use Ole automation to compact an
access database

Here\'s a procedure that works for me. You have to import the JRO type
library to compact an Access database.
Here is some code that has been posted before

procedure TMainForm.CompactDataBaseMenuClick(Sender: TObject);
var JROJetEngine: TJROJetEngine;
    strTempDBPath,
    strSource,
    strDest,
    strJetVersion: string;
    iLength: integer;
begin
  if strGlobalAccessVersion = \'2000\' then
    strJetVersion := \'5\' { Access 2000}
  else if strGlobalAccessVersion = \'97\' then
    strJetVersion := \'4\'; {Jet 3.x, Access 97}
  strTempDBPath := ExtractFilePath(strGlobalDBPath) + \'TEMP.MDB\';
  strSource := \'Data Source=\' + strGlobalDBPath + \';Jet OLEDB:Engine Type=\'
+ strJetVersion;
  strDest := \'Data Source=\' + strTempDBPath + \';Jet OLEDB:Engine Type=\' +
strJetVersion;
  try
    try
      Screen.Cursor := crHourGlass;
      if not dbModule.CloseAll then
        begin
          MessageDlg(\'Error closing some datasets, unable to compact\'
            ,mtError,[mbOk], 0);
          exit;
        end
      else
        dbModule.ADOConnection1.Close;
      Application.ProcessMessages;
      JROJetEngine := TJROJetEngine.Create(Application);
      JROJetEngine.CompactDatabase(strSource, strDest);
      SysUtils.DeleteFile(strGlobalDBPath);
      RenameFile(strTempDBPath, strGlobalDBPath);
      MessageDlg(\'The database has been packed\', mtInformation, [mbOk], 0);
    except
      on E: Exception do
        MessageDlg(\'Error packing database: \' + E.Message, mtError, [mbOk],0);
    end;
  finally
    JROJetEngine.Free;
    dbModule.ADOConnection1.Open;
    Screen.Cursor := crDefault;
  end;
end;


Stoney
Avatar billede snowball Novice
16. november 2001 - 15:19 #9
Har fundet 2 måder man skulle kunne gøre det på. Har dog ikke afprøvet nogen af dem !!!

-----------------------1. mulighed--------------------------

Question/Problem/Abstract:

How to compact or repair the access database from within delphi

Answer:


If you works with MS Access database, I sure that time-to-time you needs to compact your database. Of course, very useful to run a some process within own application.

In the next code I demonstrates how you can do it:

var
  dao: OLEVariant;
begin
  dao := CreateOleObject(\'DAO.DBEngine.35\');
  dao.CompactDatabase(\'d:\\yourDatabaseName.mdb\',
\'d:\\yourNewCompactedDatabaseName.mdb\');
end;

If you want to remove the old non-compacted database, you can simply to rename the new database file.



The MS Access is not very stable database and in network mode you can lose the data. In this case you can try to repair the database.

In the next code I demonstrates how you can do it:

var
  dao: OLEVariant;
begin
  dao := CreateOleObject(\'DAO.DBEngine.35\');
  dao.RepairDatabase(\'d:\\yourDatabaseName.mdb\');
end;

If you have the DAO 3.6, you must change the \'DAO.DBEngine.35\' string to \'DAO.DBEngine.36\'.


--------------------2. mulighed-----------------------

Question/Problem/Abstract:

How to compact and repair MS Access 2000 (Jet Engine 4) during run time using Delphi 5?
Answer:


We all know the size of MS Access keep growing fast by time because of it internal caching and temporary buffering, which in over whole effect the performance and the space required for backing-up (if needed).  The solution is to compact it from Access 2000 menus (Tools – Database Utilities – Compact and Repair Database) or to do that from inside your Delphi application.

Function CompactAndRepair(sOldMDB : String; sNewMDB : String) : Boolean;
const
        sProvider = \'Provider=Microsoft.Jet.OLEDB.4.0;\';
var
        oJetEng  : JetEngine;
begin
        sOldMDB := sProvider + \'Data Source=\' + sOldMDB;
        sNewMDB := sProvider + \'Data Source=\' + sNewMDB;

        try
            oJetEng := CoJetEngine.Create;
            oJetEng.CompactDatabase(sOldMDB, sNewMDB);
            oJetEng := Nil;
            Result  := True;
        except
            oJetEng := Nil;
            Result  := False;
        end;
end;


Example :

if CompactAndRepair(\'e:\\Old.mdb\', \'e:\\New.mdb\') then
  ShowMessage(\'Successfully\')
else
  ShowMessage(\'Error…\');

Important Notes:
1- Include the JRO_TLB unit in your uses clause.
2- Nobody should use or open the database during compacting.
3- If the compiler gives you an error on the JRO_TLB unit follow these steps:
a) Using the Delphi IDE go to Project – Import Type Library.
b) Scroll down until you reach “Microsoft Jet and Replication Objects 2.1 Library”.
c) Click on Install button.
d) Recompile a gain.



Snowball
Avatar billede nca Juniormester
17. november 2001 - 00:31 #10
Her er en afprøvet funktion:

procedure TLogoAppForm.CompactDataBaseMenuClick(Sender: TObject);
var JROJetEngine: TJetEngine;
    strTempDBPath,
    strSource,
    strDest,
    strJetVersion: string;
    //iLength: integer;
    strGlobalDBPath,ElevDB : String;
begin
  if strGlobalAccessVersion = \'2000\' then
    strJetVersion := \'5\'  { Access 2000}
  else if strGlobalAccessVersion = \'97\' then
    strJetVersion := \'4\';  {Jet 3.x, Access 97}
  ElevDB:= ExtractFileDir(Application.ExeName);
  ElevDB:= ElevDB + \'\\elever.mdb\';
  strGlobalDBPath:=  ElevDB;
  strTempDBPath := ExtractFilePath(strGlobalDBPath) + \'TEMP.MDB\';  strSource := \'Data Source=\' + strGlobalDBPath + \';Jet OLEDB:Engine Type=\' + strJetVersion;
  strDest := \'Data Source=\' + strTempDBPath + \';Jet OLEDB:Engine Type=\' + strJetVersion;
  try
    try
      Screen.Cursor := crHourGlass;
      AdoConnection1.Close;
      Application.ProcessMessages;
      JROJetEngine := TJetEngine.Create(Application);
      JROJetEngine.CompactDatabase(strSource, strDest);
      SysUtils.DeleteFile(strGlobalDBPath);
      RenameFile(strTempDBPath, strGlobalDBPath);
      JROJetEngine.Free;
      except
      on E: Exception do
        MessageDlg(\'Error packing database: \' + E.Message, mtError, [mbOk],0); end;
  finally
    Screen.Cursor := crDefault;
  end;
end;
Avatar billede poulsgaard Praktikant
19. november 2001 - 07:13 #11
takker mange gange for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester