2008-09-03 16 views
1

Grunde möchte ich wissen, ob in VB.NET 2005, wenn ein sqlcommand verwenden und es dann Wiederverwendung durch die neue Verwendung ist falsch. Wird es zu einem Speicherverlust kommen?Ist die Wiederverwendung einer Variablen in VB6 eine gute Idee?

Beispiel:

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 

EDIT: put versuchen fangen, um die Kommentare zu vermeiden, um sie nicht

Antwort

6

einfach zu erweitern, was Longhorn213 sagte, hier ist 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 

(edit) Nur als FYI, den Block von Code automatisch/schließlich um einen Versuch hüllt, dass die Dispose-Methode für Anrufe die Variable, mit der es erstellt wird. Somit ist es eine einfache Möglichkeit sicherzustellen, dass Ihre Ressource freigegeben wird. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

2

Garbage Collection verwendet, wird das erste neue aufzusammeln, wenn es ausgeführt wird.

Nur die zweite, die Sie absichtlich in den Finally-Block entsorgen. Der erste wird bei der nächsten Ausführung der Garbage Collection entsorgt.

Ich denke nicht, dass dies eine gute Idee ist. Wenn der erste Befehl nicht korrekt geschlossen wird, ist es möglich, dass Sie eine offene Verbindung zur Datenbank haben und diese nicht entsorgt wird.

Eine bessere Möglichkeit wäre, den ersten Befehl nach der Verwendung zu entfernen und ihn dann wiederzuverwenden.

0

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

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

0

Während Sammlung Müll wird nach aufzuräumen schließlich die dispose Muster ist es, das System Release alle Ressourcen früher mit dem Objekt verbunden zu helfen, Sie sollten also rufen entsorgen, sobald Sie mit dem Objekt durchgeführt werden, bevor die Neuzuweisung zu ihm.

1

Uh, um all die Leute, die sagen: „Es ist in Ordnung, keine Sorge darüber, die GC wird es handhaben ...“ der ganzen Punkt des Dispose Musters ist es, die Ressourcen, um die GC kann‘zu handhaben t entsorgen. Wenn also ein Objekt eine Dispose Methode hat, sollten Sie es besser aufrufen, wenn Sie damit fertig sind!

Zusammenfassend ist Longhorn213 korrekt, hör ihm zu.

1

Eine Sache, die ich nie ausgearbeitet habe - Wenn ich eine Klasse implementiere IDisposable, aber ich entsorge es nie selbst, ich lasse es nur herumhängen für den GC, wird der GC tatsächlich Dispose für mich anrufen?

+0

Nein (http://blogs.msdn.com/b/clyon/archive/2004/09/21/232445.aspx) –

0

vorsichtig. Wenn Sie viele von diesen in einer Schleife tun müssen, kann es langsam sein. Es ist viel besser, nur die .CommandText Eigenschaft des gleichen Befehls zu aktualisieren, wie dies (auch, können Sie die Syntax ein wenig aufzuräumen):

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

    mySql.CommandText = otherSql 

    'do other stuff' 
End Using 

Natürlich, das funktioniert nur, wenn der erste Befehl nicht mehr aktiv. Wenn Sie sich noch in der Mitte eines Datenreaders befinden, sollten Sie einen neuen Befehl erstellen.