Desenvolvimento - ASP. NET

ASP.NET 2.0 - Data Access Layer com TableAdapter

A produtividade tornou-se marca registrada na adoção de uma tecnologia, principalmente se você está preparando um projeto para um grande time de desenvolvimento. O mercado atual tende-se para utilização de ferramentas que sigam a linha do O/R Mapper (Object-Relational Mapper), ou seja, permitam fazer um mapeamento Objeto Relacional com seu banco de dados de forma que automaticamente você possa persistir seus objetos de negócios no banco de dados.

por Ramon Durães



Artigo recomendado para Visual Studio 2005

A produtividade tornou-se marca registrada na adoção de uma tecnologia, principalmente se você está preparando um projeto para um grande time de desenvolvimento. O mercado atual tende-se para utilização de ferramentas que sigam a linha do O/R Mapper (Object-Relational Mapper), ou seja, permitam fazer um mapeamento Objeto Relacional com seu banco de dados de forma que automaticamente você possa persistir seus objetos de negócios no banco de dados.

Com o .NET 2.0 ganhamos mais recursos na implementação de um modelo na linha do O/R utilizando Typed DataSets (DataSet Tipados) e TableAdapter. A idéia do TableAdapter ainda não é atender os requisitos do padrão O/R, porém, já temos disponível todas as funções para iniciar nosso primeiro objeto CRUD (Create/Read/Update/Delete).

O TableAdapter já reconhece sua chave primária, e caso você deseje, ele gera até as procedures para você. Dessa forma, ele se encarrega das ações do CRUD.

Para iniciar nosso artigo crie novo projeto conforme a Figura 01 e adicione um DataSet.


Figura 01 - Projeto inicial

Logo após adicionar o DataSet, automaticamente será carregado o Wizard do TableAdapter para lhe ajudar a criar as tabelas já com os tipos de acordo com seu banco de dados, assim como todos os conectores. O primeiro passo é você definir os dados da conexão para ter acesso ao BD. Logo em seqüência, será apresentada a tela da Figura 02, onde você vai definir se vai utilizar um Select, criar procedures automaticamente ou utilizar procedures existentes.


Figura 02 - Wizard para configuração do Adapter.

Para esse artigo, vamos seguir na opção "Use SQL statements" para montar um modelo básico. Estaremos também utilizando o banco de dados "
Northwind" em conjunto com a Tabela "Products".
Na Figura 03 você terá opção de adicionar uma query para consulta ou montar uma personalizada com o assistente Query Builder.


Figura 03 - Adicionando query consulta.

Para esse exemplo estaremos fazendo uma consulta padrão utilizando o "Select * from Products" para que possamos trazer todas as colunas da tabela Products. Feito isso, basta clicar em próximo. Logo em seguida será solicitado o nome para o método Fill (Utilizado para preencher DataSet) e para o GetData (Retorna um DataTable), em seguida marque a opção GenerateDBDirectMethods (Gerar Insert,Update,Delete individuais). Os próximos passos são representados na Figura 04.


Figura 04 - Todos métodos criados com sucesso.

Após conclusão do Wizard, você já terá disponível em seu objeto todos os métodos do CRUD por meio do TableAdapter, assim como o DataSet conforme Figura 05.


Figura 05 - DataSet "Products" e TableAdapter "ProductsTableAdapter".

Como você tem acompanhado até esse momento, não digitamos nenhuma linha de código e já temos um mecanismo completo para acesso a dados. Basta você acionar o CRUD diretamente pela camada de apresentação. Com o ASP.NET 2.0 você já poderia vincular diretamente por meio de um ObjectDataSource. Para exemplificar melhor estaremos criando mais um classe chamada de Produtos para representar sua camada de negócios. Conforme Figura 06 verifique que criamos um método chamado de Incluir e nele estamos executando o método ta.Insert que já está com todos parâmetros necessários a inclusão de um novo registro.


Figura 06 - Adicionando métodos do TableAdapter para operações do CRUD.

Conforme Figura 06 para incluir um novo registro no banco de dados basta instanciar o TableAdapter e passar os parâmetros. O mesmo vai ocorrer para as operações do CRUD. Ou seja você não precisou codificar o acesso a dados que nesse exemplo será feito totalmente pelo TableAdapter. Confira na Listagem 01 o exemplo da Classe Produtos.cs que será a nossa camada de negócios.

Produtos.cs/// <summary>
///
Summary description for Produtos
///
</summary>
public
class Produtos

{

/// <summary>
///
Inclui um registro no banco de dados
/// </summary>
///
<param name="NomeProduto"></param>
public void Incluir(string NomeProduto)

{
dsArtigoTableAdapters.
ProductsTableAdapter ta =new dsArtigoTableAdapters.ProductsTableAdapter();
//Estou passando apenas a descrição do Produto
ta.Insert(NomeProduto,1,1,
"0",0,0,0,0,true);
}

/// <summary>
///
Retorna um DataTable tipado com os dados dos Produtos.
/// </summary>
///
<returns></returns>
public dsArtigo.ProductsDataTable RetornaDados()
{
dsArtigoTableAdapters.
ProductsTableAdapter ta =new dsArtigoTableAdapters.ProductsTableAdapter();
return ta.GetData();
}

/// <summary>
///
Atualiza o DataSet diretamente no banco de dados
/// Incluindo,Excluindo,Atualizando registros.
///
</summary>
///
<param name="DataSetArtigo"></param>
///
<returns></returns>
public bool AtualizaDataSet(dsArtigo DataSetArtigo)

{
dsArtigoTableAdapters.
ProductsTableAdapter ta =new dsArtigoTableAdapters.ProductsTableAdapter();
ta.Update(DataSetArtigo);
}

}

Listagem 01 - Classe exemplo Produtos chamando TableAdapter.

Observando a Listagem 01, você já deve ter visto que todas as operações já estão cobertas pelo Adapter, onde já é possível também realizar a chamada diretamente pela camada de apresentação no lugar de criar a classe Produtos.CS. Fica a sua escolha.

Caso você esteja acompanhando esse artigo na seqüência que estamos apresentando chegou o momento de se criar a camada de apresentação conforme Figura 07.


Figura 07 - Tela para teste

A codificação necessária para o funcionamento dessa tela é instanciar nossa classe produtos chamando os métodos Incluir e RetornaDados conforme Listagem 02.

Apresentaçãopublic partial class _Default : System.Web.UI.Page

{
protected void Button1_Click(object sender, EventArgs e)
{
Produtos NegocioProdutos=
new Produtos();
NegocioProdutos.Incluir(
this.TextBox1.Text);
}

protected void Button2_Click(object sender, EventArgs e)
{
Produtos NegocioProdutos=
new Produtos();
GridView1.DataSource=NegocioProdutos.RetornaDados();
GridView1.DataBind();
}

}

Listagem 02 - Classe exemplo Produtos chamando TableAdapter.

Conforme você acompanhou nesse artigo todo nosso acesso a dados foi realizado por meio do TableAdapter que se encarregou de realizar as operações da camada de CRUD. A qualquer momento você pode configurar o Adapter adicionando novos parâmetros de consulta e filtros para recuperar os dados, assim como direcionar o acesso para utilizar procedures, definir uma nova string de conexão e suporte a transações caso necessário.

Código Fonte:
[Download]
Esse artigo foi baseado no banco de dados ""NorthWind".

Ramon Durães

Ramon Durães - Especialista em desenvolvimento de software e Microsoft Most Valuable Professional (MVP) em Visual Studio Team System. Realiza treinamentos de .NET Framework em empresas, consultoria em arquitetura de software e implantação de Visual Studio Team System. Palestrante nos principais eventos da Microsoft no Brasil (Tech-Ed 2005, Tech-Ed 2006, Tech-Ed 2007, Tech-Ed 2008, Tech-ED 2009), Microsoft Innovation Days 2007 (Salvador, Brasília, Recife, Goiânia, Natal, Maringá), Microsoft Innovation Days 2009 (Salvador) , Campus Party Brasil 2009 e eventos regionais relacionados a grupos de usuários e universidades. Conhecido autor de artigos para os principais portais de conteúdo e autor de 10 publicações eletrônicas em CD (Video-Aula) pela editora Linha de Código além dos livros "Desenvolvendo para web usando o Visual Studio 2008" e "Gerenciando projetos de software usando Visual Studio Team System" pela editora Brasport. Pode ser encontrado em seu blog http://www.ramonduraes.net e @ramonduraes no Twitter.