![]() |
![]() |
|
|
#1 |
![]() MOF User |
Hallo,
reicht es, wenn ich am Ende einer Prozedur ein recordset mit SET rs = nothing schließe oder muss ich vorher den .close-Befehl anwenden? Vielen Dank! __________________ Gruß Toni |
|
|
|
|
|
#2 |
![]() MOF Koryphäe |
soweit ich weiss nicht.
mit nothing leerst du nur die recordsetvariable um das recordset zu schließen bedarf es der Close-methode also: rs.Close __________________ GrußUwe Wenn fertig dann Thema als erledigt setzen und vllt. mal die eigene Lösung posten, damit andere auch was von haben. *bitte meine Beiträge ruhig später nochmal einsehen, ich neige auch zu nachträglichen Änderungen *wenn ich es mal vergessen habe, sag ich hiermit Danke für Eure Hilfe !!! Favoriten: www.access-im-unternehmen.de * www.access-paradies.de * www.donkarl.com Weitere www.smarttools.de ________________________________________________________________________ Laptop Celeron 420, 1.6 Ghz, 1GB-RAM, 40 GB-HD, Windows XP-Home, MS-Office Professional 2003 |
|
|
|
|
|
#3 |
|
Threadstarter
![]() MOF User |
Hallo Uwe,
vielen Dank! In der Hilfe habe ich bei close das gefunden: 'Eine Alternative zur Close-Methode ist es, den Wert einer Objektvariable auf Nothing (Set dbsTemp = Nothing) zu setzen.' Dann müssten doch die Systemresourcen wieder frei sein, oder? Kann ich irgendwie feststellen, ob sich Access durch fehlende close- bzw. nothing-Befehle aufschaukelt und die Resourcen knapp werden? __________________ Gruß Toni |
|
|
|
|
|
#5 |
|
Threadstarter
![]() MOF User |
Hallo Ingo,
das ist auf jeden Fall die sicherste Methode. Ich hatte alles auf "= nothing" und seit einiger Zeit stürzt die Applikation - sogar manchmal wenn Sie nur im Hintergrund aktiv ist - 10-20 mal täglich ab. Ich hoffe, dass das der Fehler ist. Warum es vorher ging: ??? Ich werde noch mal berichten. Vielen Dank! __________________ Gruß Toni |
|
|
|
|
|
#6 |
|
|
Im Prinzip muss man gar nichts machen - weder ein .Close absetzen, noch auf Nothing setzen.
Denn nach Ablauf einer Prozedur, in der das Recordset deklariert wurde (...also nicht global), werden laut Theorie in VB(A) alle Variablen entfernt bzw. geschlossen. Nur: Verlassen tut sich niemand darauf. Also sollte man Objektvariablen sicherheitshalber per Code behandeln und abbauen, was grundsätzlich per Nothing geschieht. Das Setzen auf Nothing zählt die Referenz auf das Objekt um eins herunter. Wenn der interne Zähler eines Objekts bei Null angekommen ist, wird es aus dem Speicher entfernt, konkret: Die Destruktor-Methjode des Objekts wird angesteuert. Wenn das Recordset innerhalb einer Prozedur deklariert wurde, dann gibt es normal auch nur innerhalb dieser Prozedur eine Referenz auf das Objekt - das Setzen auf Nothing setzt also den Referenzzähler auf Null, wodurch der Recordset-Destruktor anspringt, der implizit das .Close veranlassen sollte. Nur: Auch darauf verlässt man sich besser nicht, sondern führt das Close ausdrücklich so bald wie möglich, sprich: sobald man das Recordset nicht mehr braucht, per Code aus. Und das zusätzliche Setzen auf Nothing kann zumindest nicht schaden. Das erhöht zudem die Übersichtlichkeit und Verständlichkeit des Codes. Ciao, Sascha __________________ Microsoft Access MVPO2k bis O2010, VB6, VS2008, Delphi7, ... Bitte keine ungefragten E-Mails. Probleme werden hier gelöst. Bitte beachten: Grundlegendes zum Access-Forum Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de |
|
|
|
|
|
#7 |
|
Threadstarter
![]() MOF User |
Hallo Sascha,
können die Abstürze dadurch verursachtsein? Ich weiß mir sonst keinen Rat. __________________ Gruß Toni |
|
|
|
|
|
#8 |
![]() MOF Guru |
Hi,
der Garbage Collector von VBA ist halt nicht verlässlich. "Irgendwann" nach dem Runterzählen auf 0 wird das Objekt vernichtet. Bis dahin belegt es Speicher. Und wenn dann da hingegriffen wird, krachts. Alte Handwerkerregel: Halte deinen Arbeitsplatz sauber. Lass nichts rumliegen. Räum deine Werkzeuge weg, sobald du sie nicht mehr brauchst. Verlass dich nichtr drauf, dass die Putzkolonne das rechtzeitig/richtig/sinnvoll aufräumt. __________________ Adopt, adapt, improve!Martin Donkarl ♦ Josefs AccEPT ♦ Kelz: Relationale Datenbanken ♦ DBWiki ♦ Normalisierung (Wikipedia) ♦ Access-Tutorial ♦Yaccess ♦ Benamsungen und Codenormen ♦ Fragen richtig stellen HPs: TommyK ♦ Ardiman ♦ Jan ♦ Manuela ♦ Allen Browne (engl.) ♦ Freie Datenbankmodelle (engl.) ♦ SZ: Performance ♦ AEK-Downloads ♦ Team Möller Geändert von Atrus2711 (29.09.2009 um 11:14 Uhr). |
|
|
|
|
|
#9 |
|
Threadstarter
![]() MOF User |
Bin schon beim aufräumen. Werde mich melden, wenn alles sauber ist.
__________________ Gruß Toni |
|
|
|
|
|
#10 |
|
Threadstarter
![]() MOF User |
Bis jetzt läuft alles. Allerdings kamen schon Fehlermeldungen, dass die Objektvable nicht existiert, obwoh ich 'if not...' verwende:
If Not rs Is Nothing Then rs.Close: Set rs = Nothing Kann das Recorset einen Inhalt haben, obwohl es nicht offen ist??? __________________ Gruß Toni |
|
|
|
|
|
#11 |
![]() MOF Profi |
Hi,
mir ist auch schon aufgefallen, das Objektvariable nicht mehr gültig sind, jedoch nicht Nothing sind. Un mit anderen prüffunktionen kann man dies auch nicht sauber abfangen. Daher mache ich es immer so: Code: On Error Resume next rs.Close Set rs = Nothing __________________ Der Access Text Manager![]() http://www.abiss.de/downloads/public/atm.zip Abfrage-Assistent zur Duplikatsuche für Access ![]() http://www.abiss.de/downloads/public/acwzdup.zip |
|
|
|
|
|
#12 |
![]() MOF Guru |
Das Set rs = Nothing kann keinen Fehler auslösen, wenn rs deklariert ist (und das sollte es ja eh immer sein). Und schließen sollte man immer sobald wie mögloch. Dann braucht es keinen "Schließversuch".
__________________ Adopt, adapt, improve!Martin Donkarl ♦ Josefs AccEPT ♦ Kelz: Relationale Datenbanken ♦ DBWiki ♦ Normalisierung (Wikipedia) ♦ Access-Tutorial ♦Yaccess ♦ Benamsungen und Codenormen ♦ Fragen richtig stellen HPs: TommyK ♦ Ardiman ♦ Jan ♦ Manuela ♦ Allen Browne (engl.) ♦ Freie Datenbankmodelle (engl.) ♦ SZ: Performance ♦ AEK-Downloads ♦ Team Möller |
|
|
|
|
|
#13 |
![]() MOF Koryphäe |
Hallo,
Bist du dir sicher, dass es sowas in VBA gibt .Ich bin der Meinung, ein lokaler Objektverweis wird am Ende der Prozedur zuverlässig zerstört. Deshalb ist es in VBA nicht notwendig, lokale Verweise explizit frei zu geben. Code: Option Compare Database
Option Explicit
Sub Irgendwas()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("acTabelle1")
' viel Code
' meiner Meinung nach überflüssig
'rs.Close
'Set rs = Nothing
End Sub
Sub testen()
Dim i As Integer
For i = 1 To 10000
Call Irgendwas
Next
End Sub
__________________ Gruß Steffen |
|
|
|
|
|
#14 |
![]() MOF User |
aber auch nur, wenn der Destructor explizit Close aufruft - aber wer weiss das schon.
Bei lokalen Variablen kann vielleicht auf das ' = Nothing ' verzichtet werden, aber das ' .Close ' würde ich zur Sicherheit lieber grundsätzlich aufrufen. |
|
|
|
|
|
#15 |
![]() MOF Koryphäe |
Hallo,
Zitat: aber auch nur, wenn der Destructor explizit Close aufruft - aber wer weiss das schon .Der obere Code beweist meiner Meinung nach, dass es nicht notwendig ist. __________________ Gruß Steffen |
|
|
|