Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Dimensioni database non diminuiscono nonostante svuoto le tabelle

    Salve a tutti!

    Mediante un programma scritto in delphi 7 riempo un database MSAccess composto da una decine di tabelle. Man mano che aggiungevo record le dimensioni del database sono passate da pochi mega a 150 mega. Ora ho svuotato le tabelle tramite l'istruzione delete ma, nonostante i record siano stati effettivamente eliminati, le dimensioni del database non sono diminuite. Perchè? La dimensione del database non è proporzionale ai dati che contiene? Esiste un modo per "ricompattare"?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Access mette a disposizione uno strumento apposito per questo problema:

    Lo trovi nel menù Strumenti -> Utilità Database - > Compatta e ripristina Database...

    Se sia possibile richiamarlo da un programma esterno attraverso qualche API non lo so.
    E' anche possibile pianificare la compattazione alla chiusura del database.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: Dimensioni database non diminuiscono nonostante svuoto le tabelle

    Originariamente inviato da halinder
    La dimensione del database non è proporzionale ai dati che contiene? Esiste un modo per "ricompattare"?
    Jet (per i file mdb) non elimina i dati quando questi sono "cancellati". Li "marca" come cancellati, ma lo spazio non viene recuperato (per questioni di performance).

    Lo spazio viene solamente recuperato solo se si "compatta" il db, come ti ha detto Lele.
    Attenzione pero' ... non puoi compattare un mdb che e' in uso da parte di altri utenti. Il file deve essere aperto in modo esclusivo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Per compattarlo via codice (nelle versioni del Jet engine che supportano JRO) crea un'istanza del motore:

    JetEng := CreateOleObject('JRO.JetEngine');

    ed invoca il metodo JetEng.CompactDatabase(...parametri specifici per il tuo db...).

    Cerca informazioni su Internet relative a JRO, Jet Engine, CompactDatabase.
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

  5. #5
    Grazie a tutti per l'aiuto! Ecco la funzione con cui ho risolto il problema, dovesse servire anche a qualcun'altro...

    procedure TFm_Login.CompactDatabase;
    var MsJet: Variant;
    begin
    Fm_Login.ADOCnt.Close;
    MsJet := CreateOleObject('JRO.JetEngine');
    MsJet.CompactDatabase('Data Source="<percorso database>"; Jet OLEDB : Database password="<password database>";',
    'Data Source="<percorso database backup>"; Jet OLEDB : Database password="<password database backup>";');
    DeleteFile('<percorso database>');
    RenameFile('<percorso database backup>','<percorso database>');
    end;

    Bisogna anche importare la unit ComObj al progetto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.