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
     }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top