Gruß und Dank!
--
Thomas Hoffmann
ich mache das unter DAO (Verweis einbinden!) beim Programmstart immer
wie folgt:
************************
Option Compare Binary
Public Sub DBReorg()
Dim DB2 As New DAO.DBEngine
Dim Datendateiname As String
Dim PfadExe As String
On Error GoTo DBReorgFehler
PfadExe = App.Path
If Mid$(PfadExe, 2, 1) = ":" Then
ChDrive Left$(PfadExe, 1)
ChDir PfadExe
End If
Datendateiname = PfadExe & "\Daten.MDB"
If Dir$(PfadExe & "\Datenneu.$$$") <> "" Then
Kill PfadExe & "\Datenneu.$$$"
End If
DB2.CompactDatabase Datendateiname, PfadExe & "\Datenneu.$$$",
dbLangGeneral, dbVersion40
Kill Datendateiname
Name PfadExe & "\Datenneu.$$$" As PfadExe & "\Daten.MDB"
If Not DB2 Is Nothing Then
Set DB2 = Nothing
End If
Exit Sub
DBReorgFehler:
If Not DB2 Is Nothing Then
Set DB2 = Nothing
End If
MsgBox "Die Daten.MDB konnte nicht bereinigt und komprimiert werden!"
& vbCrLf & vbCrLf & _
"Evtl. greift ein anderes Programm bereits auf die Daten.MDB
zu." & vbCrLf & _
"Programm sollte normal starten.", vbInformation,
"Datenbankkomprimierung"
End Sub
********************
Sicher noch verbesserungsbedürftig, aber für meine Fälle geht's gut. ;-)
Gruß Wolfgang
> ich habe eine Datenbank, in die ich wiederholt größere Dateien
> einlese, bearbeite, am Ende des Programmes aber auch wieder
> aus der Tabelle lösche. (mit db.execute "DELETE * FROM...").
> Die Datensatz-ID in dieser Tabelle als Autowert, Primärschlüssel
> steht im Moment bei 3 Mios. Trotzdem ist die mdb inzwischen
> 300 MB groß. Speichert die mdb offenbar die gelöschten
> Datensätze?
Na ja, gespeichert sind sie ja schon, nur wird der Platz,
den sie innerhalb der *.mdb benötigen beim einfachen
Löschen eines Datensatzes nicht entfernt bzw. aufgefüllt.
> Oder woran liegt das denn?
Der von gelöschten Datensätzen belegte Platz wird nicht
mit den nicht gelöschten Datensätzen aufgefüllt.
> Krieg ich sie mit dbEngine.compactdatabase wieder
> kleiner?
Ja, dbEngine.CompactdataBase ist das passende
Werkzeug um eine neue *.mdb zu erstellen, bei der
die "Löschlücken" der alten *.mdb aufgefüllt sind und
damit eine wieder kleinere Datei zu erhalten.
Eine etwas modernere Variante (mit ADO/JRO) findest
im Beispielprogramm unter
www.gssg.de -> Visual Basic -> VBclassic
-> Datenbank -> CompactDataBase (ADO/JRO)
Auch das Beispielprogramm unter
www.gssg.de -> Visual Basic -> VBclassic
-> Datenbank -> ADO DemoMU 2002
bietet im Menü "Extra" eine entsprechende Funktionaliät,
wenn die *.mdb exklusiv geöffnet worden ist.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Wolfgang Bußmann schrieb:
> ich mache das unter DAO (Verweis einbinden!) beim Programmstart immer
> wie folgt:
in einem Multiuser-Betrieb wirst Du damit aber Probleme bekommen.
Und das jedes Mal zu machen ist auch in den wenigsten Fällen sinnvoll.
Und wenn Du Replikation benutzt, funktioniert es gar nicht.
Lothar Geyer
> in einem Multiuser-Betrieb wirst Du damit aber Probleme bekommen.
> Und das jedes Mal zu machen ist auch in den wenigsten Fällen sinnvoll.
> Und wenn Du Replikation benutzt, funktioniert es gar nicht.
danke für den Hinweis, war mir nicht bekannt. Aber gut zu wissen.
Das Programm wird nur selten gestartet und nicht im Multiuser-Betrieb
benutzt. Replikationen sind auch nicht vorhanden. Weiterhin ist die
Datenbank klein. Also dürften doch keine grossen Probleme auftauchen?
Aber wie geht es richtig ...? Ich benutzte normalerweise nur DAO.
Sicherlich müsste ich sie als erstes im Exclusiv-Modus öffnen. Das wäre
kein Problem mit aufzunehmen. Mein Programm fängt jedoch in der
Error-Routine eine noch offene Datenbank ab und falls erforderlich, wird
dann beim nächsten Start komprimiert. Also für meine Zwecke vollkommen
ausreichend.
Oder habe ich noch was wichtiges übersehen?
Gruß Wolfgang
Public Function dbCompact(ByVal dbName As String) As Boolean
Dim Quelle As String
On Local Error GoTo dbCompact_Error
dbCompact = False
' Prüfen, ob Datei existiert
If Dir(dbName) <> "" Then
Screen.MousePointer = 11
Quelle = left$(dbName, InStrRev(dbName, ".") - 1)
Debug.Print "DBname="; dbName, "Quelle="; Quelle; ".$$$"
' Datenbank komprimieren (ohne Passwort)
Err.Number = 0
CompactDatabase dbName, Quelle & ".$$$"
' Fehler: Datenbank passwortgeschützt
' While Err.Number = 3031
' ' Dialog zur Eingabe des Passworts aufrufen
' Screen.MousePointer = 0
' ' Das Passwort wird in der öffentlichen Variablen
' ' password gespeichert
' frm_password.Show 1
' Screen.MousePointer = 11
'
' ' Neuer Versuch mit Passwort-Angabe
' Err.Number = 0
' CompactDatabase dbName, Quelle & ".$$$", , , _
' ";pwd=" & Password
' Wend
On Local Error GoTo 0
' Originaldatei löschen
Kill dbName
' Umbenennen der neuen Datei in die Originaldatei
Name Quelle & ".$$$" As dbName
Screen.MousePointer = 0
'keine MSGbox bei start des Programms
Debug.Print "Komprimierung erfolgreich abgeschlossen!"
' MsgBox "Komprimierung erfolgreich abgeschlossen!", 64, _
' "Information"
dbCompact = True
Else
MsgBox "Datenbank " & dbName & " nicht gefunden!", _
vbCritical, "Fehler"
End If
Exit Function
dbCompact_Error:
If Err.Number = 3031 Then Resume Next
If Err.Number <> 32755 Then
MsgBox Err.Description & " (" & Err.Number & ")", _
vbCritical, "Fehler in Zeile " & Erl
End If
Screen.MousePointer = 0
End Function
Gruss Gunthard
Gut, werde wohl das mit compactdatabase wählen.
Hatte das aus dem netten Tool von http://www.fortune.de/shareware/fs-mdb2vb.htm gelernt.
Interessant für mich ist, dass auch mit db.tabledefs.Delete 'name' und hinterher neu
erstellen der Tabelle per code die db-Größe trotzdem nicht abnimmt...
Gruß TH
--
Thomas Hoffmann
>
> Hallo Thomas,
>
> ich mache das unter DAO (Verweis einbinden!) beim Programmstart immer
> wie folgt:
>
so ähnlich kenne ich das von
http://www.fortune.de/shareware/fs-mdb2vb.htm
Dieses Tool verwende ich seit Jahren immer wieder gerne.
--
Thomas Hoffmann