C# + Dispondo dbConnection e dbCommand e erro de captura
-
21-09-2019 - |
Pergunta
Estou tentando entender o DBConnection e o DBCommand e a maneira correta de descartar esses objetos após o uso.
A seguir, o snippet de código que eu tenho. Ao usar "Usando a declaração" no DBConnection e DBCommand, seria suficiente? Estou tentando evitar possível vazamento de memória.
2ª pergunta,
Eu tenho que descartar o objeto dbCommand?
Muito obrigado
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
}
}
Solução
usando using
é o mesmo que um try/finally
bloqueie com dispose()
chamado finally
.
DbCommand
deve ser envolto em um using
declaração como implementa IDisposable
.
Observe que DbCommand
é realmente uma classe abstrata, então você precisará
- deriva disso
- código em uma interface (
IDbCommand
) - Use uma das classes derivadas predefinidas, como
SqlCommand
.
DbConnection
também é uma classe abstrata, então você precisará fazer algo semelhante, como eu sugeri acima DbCommand
para isso também.
A recomendação geral é que, se um objeto implementar IDisposable
, deve ser envolto em um using
declaração tal que Dispose()
é chamado aos recursos gratuitos, mesmo que uma exceção seja lançada no bloco de declaração. No seu exemplo, então, uma boa prática seria envolver cada uma das conexões, comando, DataTable
e DbDataAdapter
objetos em a using
declaração.
Outras dicas
Sim, eu chamaria Dispose no objeto DBCommand. Em geral, a regra deve ser que, se implementar idispossáveis, você deve chamar seu método de disposição quando apropriado. Seu código parece bem formado para mim. Eu acho que você está no caminho certo.
EDITAR Na verdade, você também pode querer envolver seu dbdataadapter em uma declaração de uso, pois ele também implementa idispossáveis.
Envolvendo os objetos em using
Blocos como você deve ser suficiente; Isso fará a chamada de código Dispose
Mesmo se houver uma exceção lançada.
E sim, você deve fazer isso para o DbCommand
objeto, bem como o DbDataAdapter
e a DataTable
. Todos eles (direta ou indiretamente) implementam IDisposable
.