Quantcast
Channel: Max Claus Nunes » POO
Viewing all articles
Browse latest Browse all 3

Manipulação de Dados com Repositórios em ADO.NET SqlClient

$
0
0

Estrutura do Projeto

Hoje venho apresentar uma forma simples e produtiva para persistência e manipulação de dados.

Para isso vou utilizar a seguinte arquitetura:

Camada de Apresentação : Telas Windows Form

Camada de Entidades: Classes referente aos objetos de negócio do projeto

Camada de Repositório: Classes relacionadas aos objetos de negócios, com a responsabilidade de persistência e manipulação de dados.

Para o acesso aos dados, implementarei os repositórios utilizando o ADO.NET SqlClient. O que por um lado vai gerar um pouco mais de serviço, precisando implementar todos os comandos SQL para manipulação dos dados. Por outro lado, será um ponto positivo. Pois vamos ter a autonomia nessas manipulações, por não estar dependendo de Frameworks ORMs e tendo todas as possibilidades de comandos que o SQL pode nos proporcionar.

O código do projeto foi compartilhado no Github: https://github.com/maxcnunes/WindowsForm-Entidades-RepositorioAdoNet

Projeto Entidades

Aqui implementamos dentro do projeto de Entidades, nossa classe referente ao objeto Aluno. Tente sempre manter, para as classes de entidade, a real características e comportamentos referente ao  objeto que a classe representa. Não deixe métodos CRUD aqui, porque no mundo real um aluno não possui tais comportamentos.

Projeto Repositório

A classe a seguir será herdada por todos os repositórios concretos. Nela manteremos métodos e atributos comum aos outros repositórios.  Neste caso, foi implementado o método criar conexão, que recupera a string de conexão que está no arquivo app.config, que está localizado no projeto principal da Solution (Camada Apresentação).

Interface que define os comportamentos comuns ao todos os repositórios. Dessa forma garantimos que todos os repositórios deverão seguir esta implementação. O mais legal nesse ponto, é que foi utilizado generics. Deixando esta interface bem genérica e possibilitando que qualquer classe consiga implementá-la.

Repositório Aluno implementa a interface IRepositorio e herda as definições da classe RepositorioBase.  Aqui sim realizamos o acesso aos dados, através do SqlClient do ADO.NET.

Note que no código anterior utilizamos 3 tipos de “Execute Command”, para executar os comandos SQL.

  • ExecuteScalar: Executa o comando SQL e retorna a primeira coluna da primeira linha do conjunto de resultados retornado na consulta. As restantes linhas e colunas são ignoradas. Normalmente utilizado para COUNT, SUM e outros desse tipo.
  • ExecuteReader: Executa o comando SQL retorna uma variável que fornece uma maneira de ler um fluxo uni-direcional de uma base de dados SQL Server. Utilizado para comandos de SELECT.
  • ExecuteNonQuery: Executa o comando SQL e retorna o número de linhas afetadas. Normalmente utilizado para comandos INSERT, DELETE e UPDATE.

Projeto MDI_Escola (Apresentação)

A tela para gerenciamento do Aluno ficará assim:

Tela

Eventos da tela Cadastrar Aluno (CodeBehind da Tela):

using System;
using System.Windows.Forms;
using MDI_Escola.Entidades;
using MDI_Escola.Repositorios;

namespace WindowsForms_MDI_Escola
{
    public partial class FrmCadAluno : Form
    {
        #region Propriedades
        //Repositorio de dados
        private AlunoRepositorio _repositorioAluno;
        #endregion

        #region Metodos
        public FrmCadAluno()
        {
            //Inicializa repositorio de dados
            _repositorioAluno = new AlunoRepositorio();
            InitializeComponent();

            LimparCampos();
        }

        protected void LimparCampos()
        {
            //Limpa todos os campos textos
            lblCodigo.Text =
            txtNome.Text =
            txtEmail.Text =
            txtEndereco.Text =
            txtTelefone.Text = string.Empty;

            //Desmarca todos os campos de marcação e desativa botoes
            rbFem.Checked =
            rbMasc.Checked =
            chkAtivo.Checked =
            btnAlterar.Enabled =
            btnCancelar.Enabled =
            btnExcluir.Enabled = false;

            btnSalvar.Enabled = true;

            //Remove o auto gerador de colunas da datagridview
            dataGridViewAlunos.AutoGenerateColumns = false;

            //Recupera todos os alunos do banco
            dataGridViewAlunos.DataSource = _repositorioAluno.Todos();
        }

        protected Aluno CarregarObjAluno(int id)
        {
            //Carrega obj ALuno com os valores preenchidos nos componnetes da tela
            var aluno = new Aluno
            {
                Id = id,
                Nome = txtNome.Text,
                Email = txtEmail.Text,
                Telefone = txtTelefone.Text,
                Endereco = txtEndereco.Text,
                Ativo = chkAtivo.Checked,
                Genero = (rbMasc.Checked ? 0 : 1)
            };

            return aluno;
        }

        public void AlterarSituacaoBotao(int id, bool situacao)
        {
            //Ativa botoes Salvar e Alterar

            //id = 0 -> Está inserindo um novo registro
            if (id == 0)
                btnSalvar.Enabled = situacao;
            else
                btnAlterar.Enabled = situacao;
        }
        #endregion

        #region Eventos
        private void btnSalvar_Click(object sender, System.EventArgs e)
        {
            //Carrega valores preenchidos nos componentes da tela para o obj Aluno
            var aluno = CarregarObjAluno(0);

            //Insere aluno :
            //-------------- Retorno = true -> Exibe msg 1; Retorno = false -> Exibe msg 2; 
            MessageBox.Show(_repositorioAluno.Inserir(aluno)
                                ? "Incluido com sucesso!"
                                : "Ocorreu um erro ao salvar! Tente novamente.");
            LimparCampos();
        }

        private void dataGridViewAlunos_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            //Recupera o id referente ao registro selecionado
            var id = int.Parse(dataGridViewAlunos.CurrentRow.Cells["Id"].Value.ToString());

            try
            {
                //Recupera o aluno pelo id
                var aluno = _repositorioAluno.Obter(id);

                if (aluno == null)
                {
                    MessageBox.Show("Aluno não encontrado");
                    return;
                }

                //Carrega componentes com os valores retornados do BD
                lblCodigo.Text = aluno.Id.ToString();
                txtNome.Text = aluno.Nome;
                txtEmail.Text = aluno.Email;
                txtEndereco.Text = aluno.Endereco;
                txtTelefone.Text = aluno.Telefone;
                chkAtivo.Checked = aluno.Ativo;
                rbMasc.Checked = (aluno.Genero == 0);
                rbFem.Checked = (aluno.Genero == 1);

                btnSalvar.Enabled = false;
                btnAlterar.Enabled = btnCancelar.Enabled = btnExcluir.Enabled = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            //Recupera o id do aluno selecionado
            var id = int.Parse(lblCodigo.Text);

            //Carrega o aluno
            var aluno = CarregarObjAluno(id);

            //Atualiza aluno :
            //-------------- Retorno = true -> Exibe msg 1; Retorno = false -> Exibe msg 2; 
            MessageBox.Show(_repositorioAluno.Atualizar(aluno) ? "Iserido com sucesso!" : "Erro ao atulizar");

            //Limpa campos da tela
            LimparCampos();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            //Limpa campos da tela
            LimparCampos();
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            //Recupera codigo do aluno selecionado
            var id = int.Parse(lblCodigo.Text);

            //Exibe msg de confirmaçao e verifica se a opçao selecionada foi = 'sim'
            if (MessageBox.Show("Deseja excluir?",
                                "Excluir",
                                MessageBoxButtons.YesNo,
                                MessageBoxIcon.Question) == DialogResult.Yes)
            {
                //Caso seleciona sim, exclui aluno
                _repositorioAluno.Excluir(id);
            }

            //Limpa campos da tela
            LimparCampos();
        }

        private void txtNome_Leave(object sender, EventArgs e)
        {
            int id;
            //Tenta converter para inteiro, se não der certo define o valor = 0
            int.TryParse(lblCodigo.Text, out id);

            //Verifica se o nome esta disponivel para cadastro
            var disponivel = _repositorioAluno.VerificarNomeDisponivel(txtNome.Text, id);

            //Exibe uma msg caso o nome nao esteja disponivel
            lblMsg.Text = disponivel ? string.Empty : "Este nome não está disponível. Tente outro, por favor.";

            //Libera ou Bloqueia botao, dependendo da disponibilidade
            AlterarSituacaoBotao(id, disponivel);
        }
        #endregion
    }
}

Por último adicione um arquivo “App.config” ao projeto da camada de Apresentação e configure nele a conexão com o seu banco:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    
    <add name="MDI_Escola"
       connectionString="Data Source=NT-001;Initial Catalog=MDI_Escola;User ID=sa;Password=123"
       providerName="System.Data.SqlClient"/>

  </connectionStrings>

</configuration>


Viewing all articles
Browse latest Browse all 3

Latest Images





Latest Images