Supportnet / Forum / Datenbanken
Öffne alle 60 Sekunden Abfrage ; nach Zeit Absturz
Frage
Ich öffne für eine Terminliste, die ständig aktualisiert werden muss, alle 60 Sekunden eine Abfrage. Nach dem auslesen der Daten schließe ich diese Abfrage wieder und zerstöre den Bezug mit "set rst = nothing". Nach ungefähr 2 Stunden jedoch stürzt die Software ab und meldet, dass sie die SQL-Anweisung nicht kennen würde (mit der ich ja die ganze Zeit vorher gearbeitet habe).
Wie kann ich das beheben?
Andre
Antwort 1 von PotzBlitz
Hallo Andre,
es ist empfehlenswert, wenn du ein Objekt wie z.B. das Recordset zunächst mit der Close-Methode schliesst, bevor du es mit Nothing vernichtest. Access hat zwar eine halbwegs gut funktionierende Objektvernichtung, aber es ist trotzdem nicht auszuschliessen, dass Müll im Speicher zurückbleibt.
′-----------------------------
rst.Close
Set rst = Nothing
′-----------------------------
Alternativ empfiehlt es sich, das Recordset im Deklarationsteil des Moduls zu definieren, so dass es nach jeder Verwendung nicht ständig zerstört wird.
′-----------------------------
Private rst As Recordset
Public Sub TestProzedur()
′ Beliebige Verwendung des Recordsets
rst.Edit
rst.Fields(0) = "blabla"
rst.Update
rst.Close
End Sub
′-----------------------------
Die o.g. Beispiele gelten analog auch für Abfragen / QueryDef-Objekte.
Wie sehr man sich NICHT auf die Access-eigene Müllbeseitigung verlassen kann, habe ich vor einiger Zeit erlebt, als eine frisch entwickelte Klasse importierte Daten aufbereiten sollte, um sie dann später in der Datenbank zu speichern. Die Klasse blähte sich dabei auf 40 MB auf, wovon ohne explizite Objektschliessung/-vernichtung 30 MB bis zum Beenden von Access ständig im Arbeitsspeicher verblieben. Bei jeder Verwendung der Klasse kamen dann auch noch jeweils 30 MB dazu.
Bei einer Fehlermeldung kann übrigens der exakte Wortlaut bzw. die Fehlernummer (im Debug-Fenster "? Err.Number") sehr hilfreich sein.
Gruss
PotzBlitz
es ist empfehlenswert, wenn du ein Objekt wie z.B. das Recordset zunächst mit der Close-Methode schliesst, bevor du es mit Nothing vernichtest. Access hat zwar eine halbwegs gut funktionierende Objektvernichtung, aber es ist trotzdem nicht auszuschliessen, dass Müll im Speicher zurückbleibt.
′-----------------------------
rst.Close
Set rst = Nothing
′-----------------------------
Alternativ empfiehlt es sich, das Recordset im Deklarationsteil des Moduls zu definieren, so dass es nach jeder Verwendung nicht ständig zerstört wird.
′-----------------------------
Private rst As Recordset
Public Sub TestProzedur()
′ Beliebige Verwendung des Recordsets
rst.Edit
rst.Fields(0) = "blabla"
rst.Update
rst.Close
End Sub
′-----------------------------
Die o.g. Beispiele gelten analog auch für Abfragen / QueryDef-Objekte.
Wie sehr man sich NICHT auf die Access-eigene Müllbeseitigung verlassen kann, habe ich vor einiger Zeit erlebt, als eine frisch entwickelte Klasse importierte Daten aufbereiten sollte, um sie dann später in der Datenbank zu speichern. Die Klasse blähte sich dabei auf 40 MB auf, wovon ohne explizite Objektschliessung/-vernichtung 30 MB bis zum Beenden von Access ständig im Arbeitsspeicher verblieben. Bei jeder Verwendung der Klasse kamen dann auch noch jeweils 30 MB dazu.
Bei einer Fehlermeldung kann übrigens der exakte Wortlaut bzw. die Fehlernummer (im Debug-Fenster "? Err.Number") sehr hilfreich sein.
Gruss
PotzBlitz

