C# - CRUD no SQL Server com Dapper e MetroFramework - II


Neste artigo vamos rever conceitos básicos de acesso a dados e usar recursos para melhorar a aparência da nossa aplicação Windows Forms usando o estilo Metro.

Continuando a primeira parte do artigo vamos implementar as operações CRUD usando o Dapper.

Recursos Usados :

Implementando o CRUD com Dapper

1 - No evento Load do formulário temos o código que vai selecionar os dados da tabela Funcionarios e exibir os dados no Grid e no formulário :

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSqlServer"].ConnectionString))
                {
                    if (db.State == ConnectionState.Closed)
                    {
                        db.Open();
                    }
                    funcionarioBindingSource.DataSource = db.Query<Funcionario>("Select * from Funcionarios", commandType: CommandType.Text);
                    pContainer.Enabled = false;
                    Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                    if (ofunci != null)
                    {
                        if (!string.IsNullOrEmpty(ofunci.ImagemUrl))
                            picFoto.Image = Image.FromFile(ofunci.ImagemUrl);
                    }
                }
            }
            catch(Exception ex)
            {
                MetroFramework.MetroMessageBox.Show(this, ex.Message,"Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

2 - No evento Click do botão Procurar temos o código que permite selecionar uma imagem e exibir no PictureBox - picFoto usando o OpenFileDialog:

       private void btnProcurar_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "JPEG|*.jpg|PNG|*.png", ValidateNames = true })
            {
                if(ofd.ShowDialog() == DialogResult.OK)
                {
                    picFoto.Image = Image.FromFile(ofd.FileName);
                    Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                    if (ofunci != null)
                        ofunci.ImagemUrl = ofd.FileName;
                }
            }
        }

3 - Código do evento CellClick do MetroGrid. ocorre quando o usuário clica em uma célula do Grid e exibe os dados no Formulário:

    private void gdAlunos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                if (ofunci != null)
                {
                    if (!string.IsNullOrEmpty(ofunci.ImagemUrl))
                        picFoto.Image = Image.FromFile(ofunci.ImagemUrl);
                }
            }
            catch(Exception ex)
            {
                MetroFramework.MetroMessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

 

4 - Código do botão Deletar onde é executado a instrução SQL delete from para exclui o funcionário selecionado pelo seu ID. Se a exclusão for realizada com sucesso os dados são atualizados na interface:

 private void btnDeletar_Click(object sender, EventArgs e)
        {
            oStatus = EntityState.Deleted;
            if (MetroFramework.MetroMessageBox.Show(this, "Tem certeza que deseja Excluir este registro", "Excluir ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                try
                {
                    Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                    if (ofunci != null)
                    {
                        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSqlServer"].ConnectionString))
                        {
                            if (db.State == ConnectionState.Closed)
                            {
                                db.Open();
                            }
                            int resultado = db.Execute("delete from Funcionarios where FuncionarioID= @FuncionarioID", new { FuncionarioID = ofunci.FuncionarioID }, commandType: CommandType.Text);
                            if (resultado != 0)
                            {
                                funcionarioBindingSource.RemoveCurrent();
                                pContainer.Enabled = false;
                                picFoto.Image = null;
                                oStatus = EntityState.Unchanged;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MetroFramework.MetroMessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

5 - Código do botão Editar definindo a operação como Changed(alteração), habilitando o Panel (pContainer) e colocando o foco na caixa de texto para informar o nome:

    private void btnEditar_Click(object sender, EventArgs e)
    {
            oStatus = EntityState.Changed;
            pContainer.Enabled = true;
            txtNome.Focus();
    }

A alteração será efetivada quando o botão Salvar for clicado.

6 - Código do botão Cancelar habiliando o Panel (pContainer) resetando o bindingSource e carregando o formulário novamente:

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            pContainer.Enabled = false;
            funcionarioBindingSource.ResetBindings(false);
            this.Form1_Load(sender,e);
        }

7 - Código do botão Adicionar que define o modo de alteração para Added, habilita o Panel, inclui um novo Funcionario e se move para o último registro colocando o foco no Nome:

   private void btnAdicionar_Click(object sender, EventArgs e)
    {
            oStatus = EntityState.Added;
            picFoto.Image = null;
            pContainer.Enabled = true;
            funcionarioBindingSource.Add(new Funcionario());
            funcionarioBindingSource.MoveLast();
            txtNome.Focus();
    }

A inclusão será efetivada quando o botão Salvar for clicado.

8 - Código do botão Salvar verificamos se o modo de operação é edição e neste caso usamos a stored procedure sp_Funcionarios_Atualizar para alterar os dados. No modo Added vamos incluir dados na tabela Funcionarios usando a stored procedure sp_Funcionarios_Inserir.

private void btnSalvar_Click(object sender, EventArgs e)
        {
           try
                {
                    funcionarioBindingSource.EndEdit();
                    Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                    if (ofunci != null)
                    {
                        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSqlServer"].ConnectionString))
                        {
                            if (db.State == ConnectionState.Closed)
                            {
                                db.Open();
                            }

                            if(oStatus==EntityState.Added)
                            {
                                DynamicParameters p = new DynamicParameters();

                                p.Add("@FuncionarioID", dbType: DbType.Int32, direction: ParameterDirection.Output);
                                p.AddDynamicParams(new {Nome=ofunci.Nome,Email=ofunci.Email,Endereco=ofunci.Endereco,Telefone=ofunci.Telefone,Cargo=ofunci.Cargo,
                                 ImagemUrl=ofunci.ImagemUrl });
                                db.Execute("sp_Funcionarios_Inserir", p, commandType: CommandType.StoredProcedure);
                                ofunci.FuncionarioID = p.Get<int>("@FuncionarioID");
                            }
                            else if( oStatus==EntityState.Changed)
                            {
                                db.Execute("sp_Funcionarios_Atualizar", new { FuncionarioID =ofunci.FuncionarioID, Nome = ofunci.Nome, Email = ofunci.Email, Endereco = ofunci.Endereco,
                                                                     Telefone = ofunci.Telefone, Cargo = ofunci.Cargo, ImagemUrl = ofunci.ImagemUrl }, commandType:CommandType.StoredProcedure);
                            }
                            gdFuncionarios.Refresh();
                            pContainer.Enabled = false;
                            oStatus = EntityState.Unchanged;
                        }
                    }
                }
                catch (Exception ex)
                {
                    MetroFramework.MetroMessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
         }

Agora é só alegria...

Executando o projeto teremos o seguinte resultado:

Pegue o projeto aqui :  CRUD_Dapper.zip (sem as referências)

(Disse Jesus) Todo o que o Pai me dá virá a mim; e o que vem a mim de maneira nenhuma o lançarei fora.
João 6:37

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti