Pregunta

Básicamente quiero saber si en VB.NET 2005 si el uso de un sqlcommand y, a continuación, volver a utilizarlos con la NUEVA que está mal.Va a provocar una pérdida de memoria.

Por ejemplo:

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

EDITAR:poner try catch para evitar los comentarios sobre el no uso de ellos

¿Fue útil?

Solución

Sólo para ampliar lo Longhorn213 dijo, aquí está el código:

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

(edición), así como un FYI, utilizando ajusta automáticamente el bloque de código alrededor de un try/finally que llama al método Dispose de la variable se crea con.Por lo tanto, es una manera fácil de asegurarse de que su recurso sea liberado. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

Otros consejos

La recolección de basura se reunirán hasta el primer nuevo cuando se ejecuta.

Sólo el segundo, adrede disponer en el bloque Finally.El primero va a ser eliminados de la próxima vez que la recolección de basura se ejecuta.

Yo creo que esta no es una buena idea.Si el primer comando no está cerrada correctamente es posible que hubiera una conexión abierta con la base de datos y no serán eliminados.

Una mejor manera sería desechar el primer comando después de que haya terminado de utilizarlo, y, a continuación, volver a utilizarla.

Uh, a todas aquellas personas diciendo: "está bien, no te preocupes, el GC se manejarlo..." toda la punto de la Dispose el patrón es para manejar los recursos de la GC no se puede disponer de.Así que si un objeto tiene un Dispose método, será mejor que la llame cuando haya terminado con él!

En resumen, Longhorn213 es correcta, escucharlo.

Una cosa que nunca he trabajado fuera Si tengo una clase que implementa IDisposable, pero en realidad nunca deshacerse de mí mismo, me acaba de dejar colgando alrededor de la mesa, se la GC en realidad llamada Dispose para mí?

No, el recolector de basura encontrar la versión anterior de mySql y desasignar en su debido momento.

El recolector de elementos no utilizados deben de recoger todo lo que ha sido eliminan las referencias siempre y cuando no haya sido movido en el Montón de Objetos Grandes.

Mientras que la recolección de basura de la limpieza después de finalmente el disponer patrón está ahí para ayudar a que el sistema de liberación de los recursos asociados con el objeto de tarde, Así que usted debe llamar a dispose una vez que haya terminado con el objeto antes de volver a asignar a la misma.

Tener cuidado.Si usted tiene que hacer un montón de estos en un bucle puede ser lento.Es mucho mejor acabo de actualizar el .Propiedad CommandText del mismo comando, como este (también, usted puede limpiar la sintaxis un poco):

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

    mySql.CommandText = otherSql

   'do other stuff'
End Using

Por supuesto, que sólo funciona si el primer comando ya no está activa.Si usted todavía está en el medio de ir a través de un datareader entonces es mejor crear un nuevo comando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top