Olá pessoal, o objetivo deste tópico é utilizar e mostrar como funciona o Generics com ObjectDataSource dentro de uma página .ASPX. É simples e fácil o desenvolvimento, ou seja, não irá digitar nada dentro da página .ASPX.CS. O único código que irei digitar é da classe DAO para criar o método retornará uma lista de dados.
No artigo anterior Generics publicado no site www.aspneti.com digitei códigos, tanto na DAO quando na página. Para verificar acesse o link. http://www.aspneti.com/visualizar/downloadArtigo.aspx?ch_artigos=264
|
Requisitos:
- Framework 2.0
- IDE Visual Studio.NET 2005
- Banco de dados SQL SERVER 2005
|
Referência: Obj 1.1
O primeiro passo foi criar um projeto do tipo WEB ou ASP.NET, cliquei com o botão direito e criei dentro da pasta APP_CODE uma classe chamada “UsuarioDAO.cs”. Criei um banco de dados chamado “Usuario.mdf” e uma tabela chamada “TB001_USUARIO”. O objetivo não é mostrar como criar o banco ou tabela. (Referência Obj 1.2)

Note que é uma tabela simples e prática para ser utilizada. Possui os campos: chave do tipo int e auto numérico, nome do tipo nvarchar(50) e por último o campo email do tipo nvarchar(50).
O passo seguinte depois de criar o banco de dados é criar a conexão dentro do arquivo web.config. Existe uma diferença para a conexão do banco de dados utilizando o SQL SERVER 2005 e 2000. Com a versão nova utilizarei a tag responsável diretamente pela conexão, connectionStrings.
|
<connectionStrings>
<add name="conn" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Usuario.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
|
Referência: Obj 1.3
Antigamente se utilizava a tag appSettings para setar a conexão, hoje em dia já existe a tag chamada ConnectionStrings responsável por isso, como mostrado acima.
Após a criação do banco de dados e string de conexão no arquivo de configuração, basta criar a classe responsável pela camada de acesso a dados, ou seja, uma DAO. No começo criei uma classe chamada “UsuarioDAO.cs” cujo não foi desenvolvido nada dentro dela. Agora dentro da classe o primeiro passo é importar dois outros namespaces. (Referência Obj 1.4)
|
using System.Collections.Generic;
using System.Data.SqlClient;
|
Referência: Obj 1.4
São classes responsáveis para trazer uma lista de objetos e outra responsável para a comunicação do software com o banco de dados. O passo seguinte é colocar um namespace para a classe. (Referência Obj 1.5)
|
namespace generics.dao {
... classe / métodos ....
}
|
Referência: Obj 1.5
Por padrão não o Visual Studio .NET 2005 não vem com o namespace na classe, a versão 2003 já era colocado por padrão. Mas isso não é problema, basta clicar e digitar. Note que coloquei: generics.dao e dentro terá o nome da classe e alguns métodos. Antes de continuar dentro da classe, preciso criar uma outra classe apenas com os atributos transfer objects, os mesmos serão usados para o preenchimento da lista retornada.
Cliquei com o botão direito em cima do projeto, escolhi a opção ADD NEW ITEM, e por final na tela de TEMPLATE escolhi do tipo CLASS. Coloquei o nome de “UsuarioTO.cs”. Depois de criado, dentro da classe adicionei os seguintes parâmetros: nome, email e chave. (Referência Obj 1.6)
|
private int _chave;
private string _nome;
private string _email;
public string Email
{
get { return _email; }
set { _email = value; }
}
public string Nome
{
get { return _nome; }
set { _nome = value; }
}
public int Chave
{
get { return _chave; }
set { _chave = value; }
}
|
Referência: Obj 1.6
A classe só possui gets e sets dos atributos. Pronto, depois de criado a classe de transfer object falta apenas criar o método para retornar a lista de dados. Esse método conecta no banco de dados, faz o select na tabela e retorna dados do tipo datareader. Pego os dados datareader e transformo em uma lista do objeto usuário.
|
public List<Usuario> getUsuarioDAO()
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
{
using (SqlCommand command = new SqlCommand("select chave, nome, email from tb001_usuario", conn))
{
conn.Open();
List<Usuario> listUsu = new List<Usuario>();
using (SqlDataReader dr = command.ExecuteReader())
{
while (dr.Read())
{
UsuarioTO usuario = new UsuarioTO();
usuario.Chave = (int)dr["chave"];
usuario.Nome = (string)dr["nome"];
usuario.Email = (string)dr["email"];
listUsu.Add(usuario);
}
}
return listUsu;
}
}
}
|
Referência: Obj 1.7
Analisando a assinatura do método, note que o mesmo é público e retorna uma lista de um <tipo>. Não espera parâmetros de entrada. (Referência Obj 1.8)
|
public List<Usuario> getUsuarioDAO()
|
Referência: Obj 1.8
Após o método, veja a nova forma que pega o objeto de conexão. (Referência Obj 1.9)
|
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
|
Referência: Obj 1.9
Já foi a conexão, agora falta apenas fazer o select usando o command, abrir a conexão com o open(), declarar a lista de objeto, adicionar o resulto no objeto e retornálo. (Referência Obj 1.10)
|
using (SqlCommand command = new SqlCommand("select chave, nome, email from tb001_usuario", conn))
{
conn.Open();
List<Usuario> listUsu = new List<Usuario>();
using (SqlDataReader dr = command.ExecuteReader())
{
while (dr.Read())
{
Usuario usuario = new Usuario();
usuario.Chave = (int)dr["chave"];
usuario.Nome = (string)dr["nome"];
usuario.Email = (string)dr["email"];
listUsu.Add(usuario);
}
}
return listUsu;
|
Referência: Obj 1.10
Página ASPX
Cliquei com o botão direito do mouse em cima do projeto e adicionei um novo item do tipo WEB FORM chamado “ObjDataSource.aspx”. Ao lado direito, mais especificamente na “TOOLBOX”, existem os objetos necessários para uso. O primeiro adicionado é o objeto gridview. O Visual Studio.NET 2005 utiliza o “drag drop”, ou seja, clicar a arrastar. (Referência Obj 1.11)
|

|
Note que o objeto está separado pela ABA “Data”, ou seja, dentro da aba. O GridView está circulado na referência Obj 1.11 com o objetivo de mostrar o que está sendo usado na página .ASPX
Cliquei a arrastei para a página o objeto no módulo de design. Passando para o modo HTML, acrescentei algumas tags e colunas. (Referência Obj 1.12) |
|
Referência: Obj 1.11 |
|
|
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="false" >
<EmptyDataTemplate>
Sem registro encontrado.
</EmptyDataTemplate>
<Columns>
<asp:BoundField DataField="nome" HeaderText="nome" />
<asp:BoundField DataField="email" HeaderText="email" />
</Columns>
</asp:GridView>
|
Referência: Obj 1.12
A referência (Obj 1.2), em primeiro passo é colocar o atributo “autogeneratecolumns=false” no objeto GridView.
|
<EmptyDataTemplate>
Sem registro encontrado.
</EmptyDataTemplate>
|
Referência: Obj 1.13
A tag <EmptyDataTemplate> coloquei antes de <Columns>. Serve apenas para mostrar a descrição caso não retorne dado algum. Por exemplo: a lista de dados não retornou nada, já é detectado e com isso mostrará ao usuário “Sem registro encontrado”.
|
<Columns>
<asp:BoundField DataField="nome" HeaderText="nome" />
<asp:BoundField DataField="email" HeaderText="email" />
</Columns>
|
Referência: Obj 1.14
As colunas são mostradas de acordo com o transfer object, ou seja, os mesmos valores da classe “UsuarioDTO.cs” coloquei no atributo do GridView chamado DataField. Mostrei apenas os campos: “nome e email”.
Configurado corretamente o componente responsável em mostrar os dados, basta colocar outro objeto chamado “ObjectDataSource”. O mesmo encontra-se também junto ao “toolbox” da ferramenta IDE Visual Studio.NET 2005. (Referência Obj 1.15)
Cliquei no objeto e arrastei para minha página, ou seja, a mesma página que se encontra o GridView. Falta agora a configuração necessária para que o mesmo mostre os dados no grid. Usarei o assistente do Visual Studio.NET 2005. Em modo “design”, cliquei em cima do objeto de tela, foi mostrada uma seta ao lado direito com a opção Configure Data Source. (Referência Obj 1.16).
Cliquei em cima do link “Configure Data Source” e automaticamente apareceu uma outra tela buscando todas as classes de meu projeto. (Referência Obj 1.17)
Escolhi a classe criada “generics.dao.UsuarioDAO” e apertei o botão NEXT e fui para o próximo passo. (Referência Obj 1.18)
Automaticamente na aba SELECT mostra todos os métodos da classe que escolhi. Note que só mostrará todos os métodos públicos, métodos privados não aparecem. Foi detectado automaticamente que o mesmo retorna uma List<Usuario>. Para terminar, cliquei no botão FINISH.
Terminei de configurar o objeto, em modo SOURCE tenho que vincular o meu objeto ao gridview ao objectdatasource. Para isso coloquei o atributo: (Referência Obj 1.19)
Referência: Obj 1.19
O valor “dtSource” é apenas o nome de meu objeto ObjectDataSource. A referência Obj 1.20 mostra como ficou toda a página criada nestes passos acima.
|
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ObjDataSource.aspx.cs" Inherits="ObjDataSource" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="dtSource">
<EmptyDataTemplate>
Sem registro encontrado.
</EmptyDataTemplate>
<Columns>
<asp:BoundField DataField="nome" HeaderText="nome" />
<asp:BoundField DataField="email" HeaderText="email" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="dtSource"
runat="server" SelectMethod="getUsuarioDAO"
TypeName="generics.dao.UsuarioDAO"></asp:ObjectDataSource>
</div>
</form>
</body>
</html>
|
Referência: Obj 1.20
Cliquei F5 dentro da IDE para executar e mostrar o resultado final. Note na referência Obj 1.21 funcionou corretamente.
Para não delongar mais, devo parar por aqui. Aconselho que use o “debug” e passe por todas as linhas verificando o que está sendo feito sem mesmo digitar um linha de código na página .ASPX.
Espero ter ajudado de alguma forma, qualquer dúvida favor entrar em contato através do e-mail mauricio@aspneti.com.
Mauricio Junior
www.aspneti.com
www.mauriciojunior.org