 .NET 
- Camada de Acesso a dados - Boas Práticas (ADO .NET)
.NET 
- Camada de Acesso a dados - Boas Práticas (ADO .NET)
  
    |  | Uma Camada de Acesso a 
Dados (DAL-Data Access Layer) é composta por uma coleção de classes, 
interfaces e seus métodos e propriedades que são usadas para executar operações
CRUD (criar, ler, atualizar e excluir). | 
Uma DAL 
encapsula o código que é usado para se conectar ao banco de dados e executar 
essas operações e funciona como um elo entre as entidades de negócios em seu 
aplicativo e a camada de armazenamento de dados. Você geralmente usa uma Data 
Access Layer para criar e preencher entidades de negócios com os dados do 
banco de dados e para a atualizar e armazenar de essas entidades na base de 
dados.
				
				
Na plataforma .NET 
temos muitas possibilidades de uso da ADO.NET; assim, é importante identificar 
padrões que resolvam os tipos de problemas mais comuns no dia a dia de forma a 
garantir produtividade e facilidade em futuras manutenções de código.
É importante notar que o que é sugerido como boa prática em termos de 
arquitetura de aplicação .NET coloca a aplicação dividida em camadas funcionais. 
A utilização de uma camada de dados entre a camada de regra de negócios 
encapsulando o ADO.NET garante a padronização do mesmo para as funcionalidades 
mais comuns do dia a dia, promovendo facilidades de manutenção, extensão e 
produtividade.
Mas apenas dividir sua 
aplicação em camadas não significa que você resolveu o problema, indica que você 
apenas começou trilhando o caminho certo. A utilização de boas práticas na 
implementação das camadas é que vai garantir que sua aplicação seja robusta e 
escalável.
Características de um Data Access Layer ( ADO 
.NET)
A camada de acesso de dados deve fornecer os seguintes recursos:
  - 
  
  Conexão com a base de dados 
- 
  
  Abrir e Fechar as conexões
- 
  
  Dar suporte as operações CRUD 
- 
  
  Realizar o gerenciamento de transações 
- 
  
  Possuir a independência do provedor 
- 
  
  Realizar o gerenciamento da concorrência
Ao montar a estratégia 
para criar uma DAL devemos ter em mente os seguintes aspectos:
  
    |  | Crie todas as suas 
rotinas de acesso ao banco de dados como objetos genéricos, versáteis, ao invés 
de criar métodos do lado do cliente. A sua interface do usuário deve interagir 
com os componentes definidos na DAL (geralmente via camada de negócios) e não realizar operações diretamente com o 
banco de dados. | 
  
    |  |  | 
  
    |  | Se você quiser paginar 
os dados ou fornecer ao seu aplicativo esta funcionalidade pode utilizar um DataSet como método de dados desconectados, caso contrário, use um DataReader 
para a recuperação de dados. Para usuários XML isso se traduziria em um 
    XmlReader, e StreamReader para arquivos de texto, ambos equivalentes a um 
    DataReader para seus respectivos tipos de arquivo. | 
  
    |  |  | 
  
    |  | Use o provedor de 
    dados gerenciado correto para o seu banco de dados, ex.
    System.Data.SqlClient para o SQL Server, System.Data.OLEDB 
    para Access, System.Data.OracleClient para 
    Oracle, etc | 
  
    |  |  | 
  
    |  | Use
    DataSets fortemente 
    tipados, pois isso gera um melhor desempenho. Um dataset tipado 
    gerado é basicamente uma classe early bound herdando da classe base DataSet, 
    em oposição ao típico DataSet late bound. Fazendo assim você tem mais 
    flexibilidade para lidar com os dados e o código para leitura dos dados será 
    mais fácil visto que você pode acessar os campos e tabelas usando nomes 
    customizados, em vez da forma convencional baseada em coleção. | 
  
    |  |  | 
  
    |  | Aproveite ao 
    máximo o recurso do Caching, pois isso 
    vai aumentar significativamente o desempenho e diminuir a interação de banco 
    de dados persistente. | 
  
    |  |  | 
  
    |  | Utilize 
    procedimentos armazenados com parâmetros com o método da
    Prepare() da classe 
    Command, que armazena suas consultas para uso futuro do SQL 
    Server. Ex: oCommand.Prepare() | 
  
    |  |  | 
  
    |  | Dê preferência a 
    realizar chamadas em lote em uma única conexão ao vez de pequenas chamadas 
    usando diversas conexões com banco de dados. | 
  
    |  |  | 
  
    |  | Aproveite o pool 
    de conexão armazenando todas as suas seqüências de conexão no arquivo
    web.config. Além disso, você vai descobrir que 
    seu aplicativo irá escalar muito melhor com qualquer aumento do tráfego de 
    rede, duplicando, triplicando o valor padrão de Max 
    Pool Size de 100 para 300, e aumentando o valor padrão do
    Connect Timeout de 10 segundos para 60. | 
  
    |  |  | 
  
    |  | Balanceie a 
    utilização de Stored Procedures quanto a implementação de regras de negócio. 
    Faça isso tendo em mente bom senso quanto ao real reaproveitamento de lógica 
    e facilidade de manutenção. Muitas Stored Procedures 
    podem ser afetadas, o que acabará resultando em dificuldades de manutenção; | 
  
    |  |  | 
  
    |  | Quando houver 
    funcionalidades que sejam utilizadas por vários componentes, implemente-as 
    em uma interface separada; | 
  
    |  |  | 
  
    |  | Quando há a 
    necessidade de uso prolongado do objeto DataReader, 
    aconselha-se considerar a opção de se utilizar Datasets, que são sempre 
    desconectados (isso aumenta a escalabilidade). Quando possível, é 
    interessante que a camada de dados exponha metadados (informações a respeito 
    dos dados) tais como schema ou nomes de 
    colunas: isso oferece maior flexibilidade para a camada de negócio. Os 
    ganhos com flexibilidade têm um custo que é pago com degradação de 
    desempenho ou até mesmo escalabilidade. | 
  
    |  |  | 
  
    |  | Evite a construção 
    automática de um componente de acesso a dados para cada tabela física. 
    Considere a possibilidade de escrever seus componentes de acesso a dados num 
    nível de abstração e de normalização maior e mais próximo das necessidades 
    imediatas da camada de negócio. É muito comum a criação de uma classe 
    representando uma tabela que faz relacionamento entre duas tabelas. Neste 
    caso, dê preferência por implementar métodos nas classes principais. | 
  
    |  |  | 
  
    |  | Habilite 
    transações apenas quando for realmente imprescindível. Nunca marque todos os 
    componentes de acesso a dados com “Require 
    Transactions”. Marque tais componentes com “Supports Transactions”, 
    adicionando o seguinte atributo: [Transaction (TransactionOption.Supported)]
 | 
  
    |  |  | 
  
    |  | Ao fazer uso de 
    níveis alternativos ao default de “isolation levels” 
    em consultas, balanceie seu benefício quanto a performance e contenção, 
    confrontando os requisitos de vazão e precisão dos dados. Em casos de alta 
    vazão (throughput), a precisão dos dados pode ser prejudicada se 
    forem utilizados níveis de isolamento menos rígidos; | 
  
    |  |  | 
  
    |  | Quando a aplicação 
    contiver múltiplos componentes de acesso a dados, recomenda-se usar a camada 
    testada e de alta performance Data
    Access Application Block em suas aplicações 
    para gerenciar as conexões, executar comandos, fazer cache de parâmetros, 
    etc | 
  
    |  |  | 
  
    |  | Finalmente, 
    lembre-se de fechar, limpar e liberar todos os seus objetos de dados, não 
    importa a quantidade. | 
  
    |  |  | 
 
  
  
  João 9:39 Prosseguiu então Jesus: Eu vim a este mundo para juízo, a fim de que 
  os que não veem vejam, e os que veem se tornem cegos. 
 
Referências:
José Carlos Macoratti