Newsgroup: it.comp.lang.visual-basic
Titolo: compattazione database?

Qualcuno sa dirmi in cosa consiste la compattazione di un database
Acces e come si esegue?
grazie.roby

 grazie.roby
quando cancelli una scheda, il db segna il record ma non lo elimina
fisicamente.
quando ne inserisci, direi venga allocato lo spazio previsto: se in
struttura hai messo cognome=txt 255, se scrivi solo "rossi" ti mette anche
250 blank.
alla fine non sai piu' dove mettere l'ultimo divx, e devi far spazio :)
in access dovresti trovarla sotto il menu strumenti.
la compattazione varia leggermente secondo tu usi l'accesso dao o quello
ado/jro. qui sotto metto un po' di una pagina msdn indicata da hal1961 ma di
cui purtroppo non ho piu' il link preciso. se cerchi con le parole chiave
dovresti cmq ritrovarla.
nb: per usare jro, oltre ad ado devi inserire anche jro in
progetto|riferimenti:
da me: ms jet and replication objects 2.6
nb2: io di solito nella compattazione non butto via il db vecchio, ma lo
salvo come db_old.mdb. si sa mai..
--
hth, ciao
http://www.sundaysw.com
http://www.sundaysw.com/tmp/google.gif
Compacting a Database
As a database file is used, it can become fragmented as objects and records
are created and deleted. Periodic defragmentation reduces the amount of
wasted space in the file and can enhance performance. Compacting can also
repair a corrupted database.
The following listings demonstrate how to compact a database.
Note   Use JRO, not ADO, to compact a database.
DAO
Sub DAOCompactDatabase()
   ' Make sure there isn't already a file with the
   ' name of the compacted database.
   If Dir(".\NewNorthWind.mdb") <> "" Then Kill ".\NewNorthWind.mdb"
   ' Basic compact - creating new database named newnwind
   DBEngine.CompactDatabase ".\NorthWind.mdb", ".\NewNorthWind.mdb"
   ' Delete the original database
   Kill ".\NorthWind.mdb"
   ' Rename the file back to the original name
   Name ".\NewNorthWind.mdb" As ".\NorthWind.mdb"
End Sub
JRO
Sub JROCompactDatabase()
   Dim je As New JRO.JetEngine
   ' Make sure there isn't already a file with the
   ' name of the compacted database.
   If Dir(".\NewNorthWind.mdb") <> "" Then Kill ".\NewNorthWind.mdb"
   ' Compact the database
   je.CompactDatabase "Data Source=.\NorthWind.mdb;", _
      "Data Source=.\NewNorthWind.mdb;"
   ' Delete the original database
   Kill ".\NorthWind.mdb"
   ' Rename the file back to the original name
   Name ".\NewNorthWind.mdb" As ".\NorthWind.mdb"
End Sub
The JRO CompactDatabase method takes two connection strings, which indicate
the source database and destination database respectively. See the JRO
online Help for more information on the JRO CompactDatabase method.
In addition to defragmenting or repairing your database, CompactDatabase can
also be used to change the database password, convert the database from an
older Microsoft Jet version to a new version, to encrypt or decrypt the
database, or to change the locale of the database. Note that CompactDatabase
will automatically convert older databases to the current version, unless
you use the Jet OLEDB:Engine Type property in the destination database
parameter.

 salvo come db_old.mdb. si sa mai..
sicuramente questa è una soluzione ottima, pero' quando si fa un'applicazione
per un utente, come si fa
a creare un software dove:
-si possa compattare quando serve
- quindi l'utente deve essere avvisato di fare cio'
- evitare ogni possibilità di perdere i dati o problemi vari; cioè se lo fai tu
sviluppatore allora ti crei un mdb di sicurezza etc,
peo' per l'utente che usa il software che soluzioni, accorgimenti si usano;
soprattutto considerando che tale procedura deve essere alla portata di tutti .

 soprattutto considerando che tale procedura deve essere alla portata di
tutti
Beh, basta fare una copia (anche da programma) del db prima di avviare la
compattazione

 soprattutto considerando che tale procedura deve essere alla portata di
tutti .
in un mio db c'e' il codice qui sotto (ado(jro). mi sembra di averne preso
il nucleo dal sito comune (io non metto quasi mai commenti). puoi ragionarci
sopra. ricordati solo:
- il db (dao) / la connessione devono essere chiusi. qui maindb. qui per
semplicita' finito il pack esco. altrove riapro la connessione. vedi tu.
- una compattazione, specie se il db e' grosso, e' sempre delicata e puo'
richiedere parecchi minuti. potrebbe mancare la corrente, o schiantarsi il
disco. prima se c'e' un server copiaci il db, possibilmente in automatico e
senza che l'utente manco lo sappia. avvertilo prima, in generale, e
assicurati che delle copie se ne faccia. magari su un cd multisessione. .50e
di plastica possono valere moltissimo...
- in genere, pensa a tutti i problemi che possono verificarsi. tanto sai
gia' che succedera' qualcos'altro. oggi una mia collega voleva che le
linkassi sul desktop il batch che sul pc di un'altra collega fa il backup
dei dati sul server. non si e' detta che magari cosi' le copriva i dati coi
suoi, visto che i nomi dei file e le cartelle sarebbero stati uguali...
ciao
Public Sub dbPack()
    If MsgBox("Pack / backup the database and exit the program ?", _
     vbYesNoCancel) <> vbYes Then Exit Sub
'    On Error GoTo ConnectionError
    mainDB.Close
    Set mainDB = Nothing
    Unload frmNet
    FileCopy App.Path & "\net2.mdb", App.Path & "\net2old.mdb"
    If Dir(App.Path & "\net2new.mdb") <> "" Then Kill App.Path &
"\net2new.mdb"
    Dim CNN As JRO.JetEngine
    Dim CnnSource As String
    Dim CnnTarget As String
    ' Attenzione : Il programma compatta i database di access 97.
    ' Per compattare database diversi da access 97 cambiare il "Engine
Type=4"
    '                              es. access 2000 cambiare il "Engine
Type=5"
    Screen.MousePointer = vbHourglass
    Set CNN = New JRO.JetEngine
    CnnSource = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=net2.mdb;User
ID=Admin;Password=;"
    CnnTarget = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=net2new.mdb;Jet OLEDB:Engine Type=4;"
<!-- fantastico. ho appena convertito il db da 97 a 2000 e mi ero totalmente
scordato di questo dettaglio :) grazie -->
    CNN.CompactDatabase CnnSource, CnnTarget
    Set CNN = Nothing
    Name App.Path & "\net2.mdb" As App.Path & "\net2tmp.mdb"
    FileCopy App.Path & "\net2new.mdb", App.Path & "\net2.mdb"
    Kill App.Path & "\net2tmp.mdb"
    On Error GoTo 0
    Screen.MousePointer = vbDefault
    MsgBox "OK -- Ending Program"
ExitError:
   Exit Sub
ConnectionError:
    Screen.MousePointer = vbDefault
    MsgBox " VB #" & Err.Number & " " & Err.Description & " " & Err.Source
    Resume ExitError
End Sub