Pregunta

Estoy tratando de entender DbConnection y DbCommand, y la forma correcta de desechar los objetos después de su uso.

A continuación se muestra el fragmento de código que tengo. Mediante el uso de "using" en DbConnection y DbCommand, ¿sería suficiente? Estoy tratando de evitar la posible pérdida de memoria.

segunda pregunta,

¿Tengo que Desechar el objeto DbCommand?

muchas gracias

DbProviderFactory fac = DbProviderFactories.GetFactory(this.DatabaseProviderName);

using (DbConnection dbConn = fac.CreateConnection())
{
     dbConn.ConnectionString = this.ConnectionString;

     using (DbCommand comm = fac.CreateCommand())
     {
          comm.CommandText = "select * from aTable";
          comm.Connection = dbConn;
          DataTable targetTable = new DataTable();

          DbDataAdapter facDA = fac.CreateDataAdapter();
          facDA.SelectCommand = comm;
          facDA.Fill(targetTable);

          //assuming Adapter would open / close connection (right assumption?)

          //do something with the datatable
     }
}
¿Fue útil?

Solución

Uso using es el mismo como un bloque try/finally con dispose() llamada en finally.

DbCommand debe ser envuelto en un comunicado using ya que implementa IDisposable.

Tenga en cuenta que DbCommand es en realidad una clase abstracta por lo que tendrá que o bien

  • derivar de ella
  • código para una interfaz (IDbCommand)
  • utilizar una de las clases derivadas predefinidas como SqlCommand.

DbConnection es también una clase abstracta por lo que tendrá que hacer algo similar como he sugerido anteriormente para DbCommand para esto también.

La recomendación general es que si un objeto implementa IDisposable, que debe ser envuelto en un declaración using tal que Dispose() se llama a los recursos libres, incluso si se produce una excepción dentro del bloque de instrucciones. En el ejemplo a continuación, una buena práctica sería para envolver cada una de las conexiones, comandos, y DataTable DbDataAdapter objetos en un comunicado using.

Otros consejos

Si yo llamaría botar en el objeto DbCommand. En general, la regla debe ser que si se implementa IDisposable, debe llamar a su método Dispose cuando sea apropiado. Su código es bien formado para mí. Creo que está en el camino correcto.

Editar En realidad, es posible que desee para envolver también su DbDataAdapter en una instrucción using ya que también implementa IDisposable.

Envolver los objetos en bloques using como lo hace debe ser suficiente; Esto hará que el Dispose llamada codificada incluso si hay una excepción lanzada.

Y sí, usted debe hacer que para el objeto DbCommand, así como la DbDataAdapter y la DataTable. Todos ellos (directa o indirectamente) implementan IDisposable.

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