Domanda

Essenzialmente vorrei sapere se in VB.NET 2005 se si utilizza un oggetto sqlcommand e quindi riutilizzare utilizzando il NUOVO è sbagliato.Potrà causare una perdita di memoria.

Ad ESEMPIO:

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:mettere try catch, per evitare i commenti non li utilizza

È stato utile?

Soluzione

Solo per estendere la cosa Longhorn213 detto, ecco il codice:

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), Proprio come una CRONACA, utilizzando avvolge automaticamente il blocco di codice in giro un try/finally, che chiama il metodo Dispose sulla variabile è creato con.Così, è un modo semplice per garantire che la vostra risorsa viene rilasciato. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

Altri suggerimenti

Garbage collection, raccoglierà il primo nuovo quando viene eseguito.

Solo il secondo è volutamente smaltire nel blocco Finally.Il primo sarà smaltito la prossima volta che la procedura di garbage collection è in esecuzione.

Io non credo che questo sia una buona idea.Se il primo comando non viene chiuso correttamente, è possibile che tu vorresti aprire una connessione al database e non essere smaltiti.

Un modo migliore sarebbe quello di gettare il primo comando dopo che hai finito di usarlo, e poi riutilizzarlo.

Uh, a tutte quelle persone che dicono "è tutto OK, non preoccuparti, il GC in grado di gestire..." tutto punto del Dispose modello è in grado di gestire le risorse che il GC non può smaltire.Quindi, se un oggetto ha un Dispose metodo, è meglio chiamare quando hai finito con esso!

In sintesi, Longhorn213 è corretto, ascoltare lui.

Una cosa che non ho mai lavorato fuori - Se ho una classe che implementa IDisposable, ma non ho mai effettivamente smaltire me stesso, lascio in giro per il GC, il GC chiama in realtà Dispose per me?

No, il garbage collector trovare la vecchia versione di mySql e deallocare a tempo debito.

Il garbage collector dovrebbe raccogliere tutto ciò che è stato risolto finché non è stato trasferito in un Heap di Oggetti Grandi.

Mentre la procedura di garbage collection per ripulire dopo alla fine il modello dispose è lì per aiutare il sistema di rilascio di tutte le risorse associate con l'oggetto prima, Così si dovrebbe chiamare dispose una volta che hai finito con l'oggetto prima di ri-assegnando ad essa.

Essere attenti.Se devi fare un sacco di questi in un ciclo può essere lento.È molto meglio per aggiornare solo il .Proprietà CommandText dello stesso comando, come questo (anche, si può pulire la sintassi un po'):

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

    mySql.CommandText = otherSql

   'do other stuff'
End Using

Naturalmente, questo funziona solo se il primo comando non è più attivo.Se sei ancora in mezzo attraversando un datareader allora è meglio creare un nuovo comando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top