2010-03-30 1 views
12

ich es oft verwirrend finden, wann es angemessen ist zu verwenden:Was ist der Unterschied zwischen rs.close vs rs = nichts in einem RecordSet

rs.Close 

Gegensatz zu

Set rs = Nothing 

kann ich verstehen Ich muss eine Verbindung zu einer Quelle schließen, aber sollte ich beide verwenden, wenn die Variable den Gültigkeitsbereich verlässt?

Kann ich die Variable einfach auf Nothing setzen, um den Schritt zum Schließen der Verbindung zu überspringen? Wäre dies eine schlechte Praxis?

Antwort

11

Mit der "Close" -Methode schließen Sie die Verbindung zur Datenbank, sind aber immer noch im Speicher, wo Sie mit der Methode "Open" wieder öffnen können.

Wenn Sie das Recordset auf "Nothing" setzen, wird das Objekt vollständig aus dem Speicher freigegeben.

+0

So hat dabei einen Bypass die Notwendigkeit für die anderen tun? –

+0

Nicht wirklich, obwohl Sie umgehen können, das Re-Cord-Set auf nichts festzulegen, und kein Fehler auftreten wird. Es ist nur, dass es die beste Vorgehensweise ist, das Recorset auf nichts zu setzen, nachdem Sie es geschlossen haben, besonders wenn Sie dieses Re-Cord-Set nicht verwenden oder wenn Sie nicht erneut auf dasselbe Re-Cord-Set zugreifen werden. –

+2

Ihre Antwort bezieht sich auf Datenbankverbindungen, aber die Frage verwendete ein Recordset. Datenbankvariablen unterscheiden sich von anderen darin, dass das, was Sie sicher mit ihnen tun können, davon abhängt, wie sie initialisiert wurden (CurrentDB vs. DBEngine (0) (0)). Das Schließen des Re-Cord-Sets schließt die Datenbank-Verbindung mit einer Re-Cord-Set-Variablen überhaupt nicht. –

7

Die Close-Methode zerreißt die Speicherstruktur.

Wenn Sie die Variable auf Nothing setzen, wird der Zeiger auf diese Speicherstruktur gelöscht.

Theoretisch sollte das Löschen des Zeigers den Speicher freigeben, auf den sich der Zeiger bezog, da VBA Referenzzählen verwendet, um zu bestimmen, wann es Speicher freigeben kann. Leider können verschiedene Dinge schief gehen und die Referenzzählung kann aus dem Gleichgewicht geraten, und Speicher wird nicht freigegeben, selbst wenn es sein sollte.

Um sicher zu sein, dass Sie keine Speicherlecks oder die seltsamen Bugs, die durch implizite und unveröffentlichte Referenzen verursacht werden, verwenden, schließen Sie beide und setzen auf Nothing.

5

Sie Cord-Nichts, ohne einstellen Nähe zu nennen, nach offizieller Dokumentation:

Eine Alternative zu der Close-Methode ist es, den Wert einer Objektvariable auf Nothing (Set dbsTemp = Nothing) einzustellen .

Weitere Informationen: Recordset.Close Method (DAO)

Verwandte Themen