Frage

Im Wesentlichen möchte ich wissen, ob es in VB.NET 2005 falsch ist, einen SQL-Befehl zu verwenden und ihn dann mithilfe von NEW wiederzuverwenden.Wird es einen Speicherverlust verursachen?

Z.B:

try

dim mySQL as new sqlcommand(sSQL, cnInput)

// do a sql execute and read the data 

mySQL = new sqlcommand(sSQLdifferent, cnInput)

// do sql execute and read the data
catch ...

finally

if mysql isnot nothing then
   mysql.dispose
   mysql = nothing
end if

BEARBEITEN:Fügen Sie try Catch ein, um Kommentare darüber zu vermeiden, dass sie nicht verwendet werden

War es hilfreich?

Lösung

Um zu erweitern, was Longhorn213 gesagt hat, hier der Code dafür:

Using mysql as SqlCommand = new SqlCommand(sSql, cnInput)
  ' do stuff'
End Using

Using mysql as SqlCommand = new SqlCommand(otherSql, cnInput)
  ' do other stuff'
End Using

(bearbeiten) Nur zu Ihrer Information: using umschließt den Codeblock automatisch um einen try/finally, der die Dispose-Methode für die Variable aufruft, mit der er erstellt wurde.Somit ist es eine einfache Möglichkeit, sicherzustellen, dass Ihre Ressource freigegeben wird. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

Andere Tipps

Die Garbage Collection sammelt die ersten neuen Dateien, wenn sie ausgeführt wird.

Nur den zweiten entsorgen Sie absichtlich im „Finally“-Block.Der erste wird bei der nächsten Ausführung der Garbage Collection entsorgt.

Ich glaube nicht, dass das eine gute Idee ist.Wenn der erste Befehl nicht korrekt geschlossen wird, ist möglicherweise eine offene Verbindung zur Datenbank vorhanden und diese wird nicht verworfen.

Eine bessere Möglichkeit wäre, den ersten Befehl zu verwerfen, nachdem Sie ihn nicht mehr verwendet haben, und ihn dann wiederzuverwenden.

Äh, an all die Leute, die sagen: „Es ist in Ordnung, machen Sie sich keine Sorgen, der GC wird sich darum kümmern …“ das Ganze Punkt des Dispose Das Muster besteht darin, diese Ressourcen im GC zu verwalten kippen entsorgen.Wenn also ein Objekt eine hat Dispose Methode, rufen Sie sie besser auf, wenn Sie damit fertig sind!

Zusammenfassend hat Longhorn213 Recht, hören Sie ihm zu.

Eines habe ich nie herausgefunden: Wenn ich eine Klasse umsetze IDisposable, aber ich entsorge es nie selbst, ich lasse es einfach für den GC herumliegen, ob der GC tatsächlich anruft Dispose Für mich?

Nein, der Garbage Collector wird die alte Version von MySQL finden und sie zu gegebener Zeit freigeben.

Der Garbage Collector sollte alles auffangen, was dereferenziert wurde, solange es nicht in den Large Object Heap verschoben wurde.

Während die Müllabfuhr hinter Ihnen aufräumt letztlich Das Dispose-Muster soll dem System helfen, mit dem Objekt verknüpfte Ressourcen früher freizugeben. Daher sollten Sie dispose aufrufen, sobald Sie mit dem Objekt fertig sind, bevor Sie es erneut zuweisen.

Seien Sie vorsichtig.Wenn Sie viele davon in einer Schleife ausführen müssen, kann es langsam sein.Es ist viel besser, einfach die .CommandText-Eigenschaft desselben Befehls wie folgt zu aktualisieren (Sie können außerdem die Syntax ein wenig bereinigen):

Using mysql as New SqlCommand(sSql, cnInput)
  ' do stuff'

    mySql.CommandText = otherSql

   'do other stuff'
End Using

Das funktioniert natürlich nur, wenn der erste Befehl nicht mehr aktiv ist.Wenn Sie noch dabei sind, einen Datenleser durchzugehen, erstellen Sie besser einen neuen Befehl.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top