Edição de dados no GridView utilizando os padrões DAO, Model e Singleton - Parte I

Existem alguns problemas comuns nos projetos de software, entre eles a não utilização de padrões de desenvolvimento e a não simplicidade em usá-las.

Edição de dados no GridView utilizando os padrões DAO, Model e Singleton - Parte I

Existem alguns problemas comuns nos projetos de software, entre eles a não utilização de padrões de desenvolvimento e a não simplicidade em usá-las. Para facilitar nossa vida, existem diversas formas de se padronizar seu projeto para haver reutilização de código e a otimização de tempo e custo. Uma destas formas será apresentada a seguir.

Este artigo apresentará um cadastro de clientes bem simples utilizando os padrões DAO, Model, Singleton e sua aplicação na prática em uma Gridview customizada.

Antes de criarmos nossa aplicação, vamos entender os conceitos básicos abordados:

Singleton
Este padrão utiliza apenas uma instância de sua classe em todo o projeto e sendo acessada apenas de um lugar na aplicação. Para implementá-la, basta declarar seu construtor como private, disponibilizar um método estático para retornar o objeto já criado pelo atributo readonly criado quando a aplicação é iniciada.

Segue um exemplo na Listagem 01:

/// 
/// Classe de persistência para os Clientes.
///
public class ClienteDAO
{
///
/// Faz a instância somente uma vez em toda a aplicação.
///
private static readonly ClienteDAO instance = new ClienteDAO();

///
/// Construtor privado da classe DAO.
///
private ClienteDAO()
{}

///
/// Retorna a instância atual da classe DAO.
///
public static ClienteDAO GetInstance()
{
return instance;
}
}


Listagem 1

Model
O model, nada mais é que um modelo da entidade de seu banco de dados com todos os atributos e propriedades. Ela será utilizada em sua camada DAO abordada logo abaixo. Veja um exemplo da aplicação do padrão Model na Listagem 02.

Listagem 02: Exemplo do Model

/// 
/// Classe Model do Cliente
///
public class Cliente
{
private string id;
public string ID
{
get { return id; }
set { id = value; }
}

private string nome;
public string Nome
{
get { return nome; }
set { nome = value; }
}

private string email;
public string Email
{
get { return email; }
set { email = value; }
}

public Cliente()
{ }
}


Listagem 1

DAO (Data Access Object)
Para separar a aplicação em 3 camadas, teremos esta camada de persistência, ou seja, a camada que cuida do acesso a dados e a Model que possui estes dados em memória. Vejamos um a implementação dos métodos da classe ClienteDAO. O código da Listagem 01 foi alterado para o da Listagem 03 como abaixo.

Listagem 03: Exemplo do DAO

/// 
/// Classe de persistência para Cliente.
///
public class ClienteDAO
{
///
/// Faz a instância somente uma vez em toda a aplicação.
///
private static readonly ClienteDAO instance = new ClienteDAO();

///
/// Construtor privado da classe DAO.
///
private ClienteDAO()
{}

///
/// Retorna a instância atual da classe DAO.
///
public static ClienteDAO GetInstance()
{
return instance;
}

///
/// Salva/Atualiza as informações da classe Model. Retorna true caso sucesso.
///
/// Evento a ser salvo.
public bool Save(Cliente cliente)
{
//Cria os parametros do SQL para o comando Inserir ou Atualizar
SqlParameter [] pars = new SqlParameter[3];
pars[0] = new SqlParameter("CLI_ID", cliente.ID);
pars[1] = new SqlParameter("CLI_NOME", cliente.Nome);
pars[2] = new SqlParameter("CLI_EMAIL", cliente.Email);

try
{
//verificando se é para inserir ou atualizar
if (Find(cliente.ID) != null)
{
//Executando a transação passando a conexão,o tipo do comando, o T-SQL e os parametros criados acima
return SqlHelper.ExecuteNonQuery(Base.getConnection(),
CommandType.Text, Statements.UPDATE_CLIENTE,
pars) > 0;
}
else
{
//Executando a transação passando a conexão,o tipo do comando, o T-SQL e os parametros criados acima
return SqlHelper.ExecuteNonQuery(Base.getConnection(),
CommandType.Text, Statements.INSERT_CLIENTE,
pars) > 0;
}
}
catch (Exception ex)
{
return false;
}
}

///
/// Procura um registro pelo seu ID e retorna sua classe Model. Null caso nenhum.
///
/// ID do evento.
public Cliente Find(string id)
{
SqlParameter par = new SqlParameter("CLI_ID", id);

try
{
//Executando a transação passando a conexão,o tipo do comando, o T-SQL e os parametros criados acima

DataTable dt =
SqlHelper.ExecuteDataset(Base.getConnection(),
CommandType.Text,
Statements.SELECT_CLIENTE_WHERE, par).Tables[0];
//Criando o objeto da classe model para retorno do método
Cliente cliente = new Cliente();

cliente.CliID = dt.Rows[0]['CLI_ID'].ToString();
cliente.Nome = dt.Rows[0]['CLI_NOME'].ToString();
cliente.Email = dt.Rows[0]['CLI_EMAIL'].ToString();

return cliente;
}
catch (Exception ex)
{
return null;
}
}

///
/// Retorna todos os registros. Null caso nenhum.
///
public DataTable Find()
{
try
{
//Executando a transação passando a conexão,o tipo do comando e o T-SQL
return
SqlHelper.ExecuteDataset(Base.getConnection(),
CommandType.Text,
Statements.SELECT_CLIENTE).Tables[0];
}
catch (Exception ex)
{
return null;
}
return null;
}

///
/// Exclui o registro. True caso sucesso.
///
/// ID do registro.
public bool Delete(string id)
{
SqlParameter par = new SqlParameter("CLI_ID", id);

try
{
//Executando a transação passando a conexão,o tipo do comando, o T-SQL e os parametros criados acima
return
SqlHelper.ExecuteNonQuery(Base.getConnection(),
CommandType.Text,
Statements.DELETE_CLIENTE, par) > 0;
}
catch (Exception ex)
{
return false;
}
}
}


Listagem 3

Note que estou usando uma classe estática ‘SqlHelper’. Ela serve para nos ajudar com o DataAdapter, DataSet, os NonQuery e Scalar. Segue o link para baixar esta classe: http://www.wiiarenerds.com.br/dev/sarti/SQLHelper.zip
A classe estática Base, fui utilizada para armazenar todas as informações referente ao arquivo de configuração, o web.config, segue na Listagem 04 sua estrutura:

Listagem 04: Exemplo do Base

/// 
/// Classe Base da aplicação. Nela ficam todos os dados das conexões e os atributos do /// web config.
///
public static class Base
{
public static string getConnection(string Server, string UserID, string Password, string Catalog, string Timeout)
{
return "Data Source=" + Server + ";Initial Catalog=" + Catalog + ";User Id=" + UserID + ";Password=" + Password;
}

///
/// Dados coletados do web config
///
public static string getConnection()
{
string server = ConfigurationManager.AppSettings.Get("Server");
string user = ConfigurationManager.AppSettings.Get("User");
string password = ConfigurationManager.AppSettings.Get("Password");
string catalog = ConfigurationManager.AppSettings.Get("Catalog");
string timeout = ConfigurationManager.AppSettings.Get("ConnectionTimeout");

return getConnection(server, user, password, catalog, timeout);
}
}


Listagem 4

Outra classe estática utilizada foi a ‘Statements’. Nela temos todos os transacts-SQL. Segue abaixo, na Listagem 05, o script de criação da tabela de Clientes e, na Listagem 06, seus comandos na classe Statements:

Listagem 05: Script da tabela de Clientes

CREATE TABLE TB_CLI_CLIENTE
(
CLI_ID int IDENTITY(1,1) NOT NULL,
CLI_NOME nvarchar(200) NULL,
CLI_EMAIL nvarchar(100) NULL,
CONSTRAINT PK_TB_CLI_CLIENTE PRIMARY KEY
(CLI_ID ASC)
)


Listagem 5

Listagem 06: Exemplo de Statements

using System;
using System.Data;
using System.Configuration;

///
/// Statements das tabelas do sistema.
///
public static class Statements
{

#region TB_CLI_CLIENTE
public const string SELECT_CLIENTE =
"SELECT " +
" CLI_ID, CLI_NOME, CLI_EMAIL " +
"FROM " +
" TB_CLI_CLIENTE";

public const string SELECT_CLIENTE_WHERE =
"SELECT " +
" CLI_ID, CLI_NOME, CLI_EMAIL " +
"FROM " +
" TB_CLI_CLIENTE " +
"WHERE " +
" CLI_ID = @CLI_ID";

public const string INSERT_CLIENTE =
"INSERT INTO " +
" TB_CLI_CLIENTE " +
" (CLI_NOME, CLI_EMAIL) " +
"VALUES " +
" (@CLI_NOME, @CLI_EMAIL) ";

public const string UPDATE_CLIENTE =
"UPDATE " +
" TB_CLI_CLIENTE " +
"SET " +
" CLI_NOME = @CLI_NOME " +
" ,CLI_EMAIL = @CLI_EMAIL " +
"WHERE " +
" CLI_ID = @CLI_ID";

public const string DELETE_CLIENTE =
"DELETE " +
" TB_CLI_CLIENTE " +
"WHERE " +
" CLI_ID = @CLI_ID";

#endregion
}


Listagem 6

Conclusão
Bom, vimos os conceitos dos padrões de desenvolvimento e como implementá-los nas classes Model e DAO utilizando os ‘Helpers’ para auxilio na execução das transações SQL e classes ‘Base’ para a conexão. No próximo artigo criaremos um WebSite e iremos usar estas classes para a edição de dados de Clientes em uma GridView customizada.

O melhor celular intermediário para importar?

Conteúdo relacionado

Realme GT Master: Celular Premium da marca chega ao Brasil; confira preços e ficha
Celulares

Realme GT Master: Celular Premium da marca chega ao Brasil; confira preços e ficha

Lançado dia 19 de outubro de 2021 no Brasil, o Realme GT Master Edition chega para ser o carro-chefe de tecnologias da fabricante.

Asp .Net - JavaScriptSerializer: JSON em C#
Programação

Asp .Net - JavaScriptSerializer: JSON em C#

JavaScriptSerializer é uma classe responsável por serialização de outras classes para a linguagem que o javascript entende, JSON. Esta é a mesma utilizada internamente pela camada de comunicação assíncrona do Asp .Net para serializar e desserializar os dados passados entre o navegador e o servidor Web.

A Escolha do C# e o que é FrameWork
Programação

A Escolha do C# e o que é FrameWork

O C# é uma solução poderosa, produtiva e fácil de usar. Veja o porque de escolher a linguagem da MS. E também saiba o que é FrameWork.