C # + Eliminación DbConnection y DbCommand y error captura
-
21-09-2019 - |
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
}
}
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
.