Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Access-Datenbank wird immer größer

55 views
Skip to first unread message

Thomas Hoffmann

unread,
Mar 7, 2009, 5:10:57 AM3/7/09
to
Tag,
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? Oder woran liegt das denn?
Krieg ich sie mit dbEngine.compactdatabase wieder kleiner?
Oder gibts eine andere Möglichkeit?

Gruß und Dank!

--
Thomas Hoffmann

Wolfgang Bußmann

unread,
Mar 7, 2009, 5:56:42 AM3/7/09
to

Hallo Thomas,

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

Peter Götz

unread,
Mar 7, 2009, 8:07:42 AM3/7/09
to
Hallo Thomas,

> 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)


Lothar Geyer

unread,
Mar 7, 2009, 8:49:41 AM3/7/09
to
Hallo Wolfgang,

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

Wolfgang Bußmann

unread,
Mar 7, 2009, 12:21:39 PM3/7/09
to

Hallo Lothar,

> 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

Gunthard Pupke

unread,
Mar 7, 2009, 2:24:43 PM3/7/09
to

Gefunden:
http://www.vb-fun.de/cgi-bin/forumarchiv.pl?archiv=0150&ID=1&action=zeigeseite&nummer=48404#Atext
Aufruf:
dbCompact ("C:\"Datenbank.mdb")

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

Thomas Hoffmann

unread,
Mar 7, 2009, 4:57:51 PM3/7/09
to
Vielen Dank Peter,

>
> 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.
>
> 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.
>

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

Thomas Hoffmann

unread,
Mar 7, 2009, 4:59:19 PM3/7/09
to
Danke, Wolfgang,


>
> 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

0 new messages