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.

Por | @oficinadanet Programação
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.

Mais sobre: C# grid view DAO
Share Tweet
Recomendado
Comentários
Carregar comentários
Destaquesver tudo