Há casos onde é retornado ao Cliente pela camada de acesso à dados objetos do tipo DataReader. Seja ele qual for (OleDb, Sql, Odbc ou Oracle) é um tanto perigoso. Como já sabemos, para que o DataReader resgate os valores da Fonte de Dados, é necessário ter uma conexão ativa com o mesmo, caso contrário, não conseguirá.
Neste cenário, o que realmente é comum são funções que retornam DataReaders, utilizando a opção CloseConnection do Enumerador CommandBehavior, que faz sentido, deixando a cargo do DataReader fechar a conexão com a Fonte de Dados assim que finalizar seu trabalho. Com isso, temos dois problemas:
• Ao retornar XXXDataReader para a camada de negócios, ou mesmo para a camada de apresentação, gera-se uma dependência do Provider, ou seja, se futuramente pretender migrar de Base Dados/Provider terá que rescrever tudo;
• Quando não se utiliza alguma DAL (Data Access Layer) para executar comandos e gerir as conexões com a Fonte de Dados, fica a cargo* do Cliente fechar o DataReader, pois sabemos que temos uma conexão o servindo qual será/deverá ser fechada quando o DataReader for fechado e, em muitos casos por algum descuido, pode não ser fechado o DataReader, e consequentemente “estourando” o pool de conexões com a Fonte de Dados, impedindo assim que se abram novas conexões.
* DALs também permitem que se retarde o fechamento da conexão com a Base de Dados, o qual deve se feita explicitamente.