C# - CRUD Básico com Linq to SQL


Embora o Entity Framework tenha recebido todos os holofotes e o LINQ to SQL esteja na penumbra, relegado ao papel de coadjuvante, ainda temos a opção de usar os recursos do LINQ to SQL em nossas aplicações.

É claro que dependendo do cenário o LINQ to SQL deve dar lugar ao Entity Framework visto que esta ferramenta ORM recebe agora todos os esforços de desenvolvimento enquanto que o LINQ to SQL permanece apenas por uma questão de compatibilidade.

Neste artigo eu vou mostrar como podemos usar o LINQ to SQL em uma aplicação Windows Forms para realizar as operação CRUD para incluir, editar e excluir dados de um banco de dados SQL Server.

Eu vou usar o Visual Studio 2012 Professional versão trial

Abra o Visual Studio 2012 e no menu File clique em New Project;

A seguir selecione o template Visual C# -> Windows -> Windows Forms Application informando o nome CRUD_LinqToSQL;

Vamos agora incluir uma referência ao Linq to SQL no nosso projeto;

No menu Project clique em Add New Item e a seguir selecione o template LINQ to SQL Classes informando o nome LinqDados.dbml e clique no botão Add;

A seguir abra a Janela Server Explorer e defina uma conexão com um banco de dados SQL Server.

Eu estou usando uma conexão com o banco de dados Cadastro.mdf e vou usar a tabela Clientes;

Selecione a tabela desejada, no nosso caso Clientes, e arraste para o descritor LINQ to SQL que irá gerar o mapeamento da tabela para a classe Cliente:

Vamos agora incluir no formulário form1.cs um controle DataGridView chamado dgvClientes e 4 botões de comando: btnIncluir, btnAtualizar, btnDeletar e uma Label chamada lblmsg conforme o leiaute da figura a seguir:

Vamos agora ao código da aplicação...

Declare os seguintes namespaces no formulário form1.cs:

using System;
using System.Linq;
using System.Windows.Forms;

Logo após a declaração do formulário form1 vamos definir as variáveis e objetos usados no projeto:

private int contaLinhas;
private int RowId = 0;
private int _id = 0;
private string _nome;
private string _endereco;
private string _telefone;
private string _email;


LinqDadosDataContext db = new LinqDadosDataContext();

No evento Load do formulário digite o código abaixo:

private void Form1_Load(object sender, EventArgs e)
        {
            BindDataGridView();
        }

O código da rotina BindDataGridView() é dado a seguir:

 private void BindDataGridView()
 {
   var getData = from c in db.Clientes
                          select c;
                
   dgvClientes.DataSource = getData;
   dgvClientes.Columns[0].ReadOnly = true;
   contaLinhas = dgvClientes.RowCount - 1;
 }

No evento CellClick do controle DataGridView devemos definir o código a seguir onde obtemos o valor atual do índice da linha e o valor do código do cliente (_id)

 private void dgvClientes_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            RowId = dgvClientes.CurrentRow.Index;
            _id = Convert.ToInt32(dgvClientes[0, RowId].Value);

            contaLinhas = dgvClientes.RowCount - 1;

            if (RowId == contaLinhas)
            {
                btnIncluir.Visible = true;
            }

            btnDeletar.Visible = true;
            btnAtualizar.Visible = true;
        }

No evento click do botão Incluir verificamos se as células estão preenchidas e obtemos os valores para a seguir atribuí-los a entidade cliente e persisti-la na base de dados:

 private void btnIncluir_Click(object sender, EventArgs e)
 {
            if (dgvClientes.Rows[RowId].Cells[1].FormattedValue.ToString() != "")
            {
                _nome = dgvClientes.Rows[RowId].Cells[1].Value.ToString();
            }
            else { _nome = null; }

            if (dgvClientes.Rows[RowId].Cells[2].FormattedValue.ToString() != "")
            {
                _endereco = dgvClientes.Rows[RowId].Cells[2].Value.ToString();
            }
            else { _endereco = null; }

            if (dgvClientes.Rows[RowId].Cells[3].FormattedValue.ToString() != "")
            {
                _telefone = dgvClientes.Rows[RowId].Cells[3].Value.ToString();
            }
            else { _telefone = null; }

            if (dgvClientes.Rows[RowId].Cells[4].FormattedValue.ToString() != "")
            {
                _email = dgvClientes.Rows[RowId].Cells[4].Value.ToString();
            }
            else { _email = null; }

            try
            {
                    Cliente cli = new Cliente();
                    if (_nome != null && _endereco != null && _telefone != null && _email != null)
                    {
                        cli.nome = _nome;
                        cli.endereco = _endereco;
                        cli.telefone = _telefone;
                        cli.email = _email;
                        //db.Clientes.InsertOnSubmit(cli);
                        db.SubmitChanges();
                    }
                    else 
                    { 
                        MessageBox.Show("Informe os valores para inclusão..."); 
                    }
                    BindDataGridView();
                    lblmsg.Text = "Registro incluído com sucesso !!";
                    lblmsg.Visible = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
  }

No evento click do botão Atualizar também obtemos os valores das células em edição obtemos os dados atuais e atualizamos os valores :

 private void btnAtualizar_Click(object sender, EventArgs e)
        {
            if (dgvClientes.Rows[RowId].Cells[1].Value != null)
            {
                _nome = dgvClientes.Rows[RowId].Cells[1].Value.ToString();
            }
            if (dgvClientes.Rows[RowId].Cells[2].Value != null)
            {
                _endereco = dgvClientes.Rows[RowId].Cells[2].Value.ToString();
            }
            if (dgvClientes.Rows[RowId].Cells[3].Value != null)
            {
                _telefone = dgvClientes.Rows[RowId].Cells[3].Value.ToString();
            }
            if (dgvClientes.Rows[RowId].Cells[4].Value != null)
            {
                _email = dgvClientes.Rows[RowId].Cells[4].Value.ToString();
            }
            if (_id != 0)
            {
                var getData = (from cliente in db.Clientes
                                       where cliente.id == _id
                                       select cliente).Single();

                getData.nome = _nome;
                getData.endereco = _endereco;
                getData.telefone = _telefone;
                getData.email = _email;

                db.SubmitChanges();

                BindDataGridView();
                lblmsg.Text = "Registros atualizados com sucesso !!";
                lblmsg.Visible = true;
            }
  }

No botão Deletar o código solicita a confirmação do usuário e percorre as células do grid para obter o id do cliente da célula selecionada. A Seguir obtemos os valores atuais da entidade e usando o método DeleteOnSubmit() deletamos a linha selecionada:

 private void btnDeletar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Deseja excluir o registro selecionado?",
                "Aviso", MessageBoxButtons.YesNo,
                MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, 0, false)
                == DialogResult.Yes)
            {
                for (int i = 0; i < dgvClientes.SelectedRows.Count; i++)
                {
                    RowId = dgvClientes.SelectedRows[i].Index;
                    _id = Convert.ToInt32(dgvClientes[0, RowId].Value);

                    if (_id != 0)
                    {
                            var getData = (from cliente in db.Clientes
                                                   where cliente.id == _id
                                                  select cliente).Single();

                            db.Clientes.DeleteOnSubmit(getData);
                            db.SubmitChanges();
                    }
                }
            }
            lblmsg.Text = "Registro deletado com sucesso !!";
            lblmsg.Visible = true;
            BindDataGridView();
        }

O botão Sair apenas solicita a confirmação para encerrar a aplicação;

  private void btnSair_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Deseja encerrar a aplicação ?",
               "Aviso", MessageBoxButtons.YesNo,
               MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, 0, false)
               == DialogResult.Yes)
            {
                this.Close();
            }
        }

Executando o projeto iremos obter:

O que mostrei aqui é mais uma das diversas maneiras de realizarmos a manutenção de dados de forma bem simples usando o DataGridView e o LINQ to SQL.

Pegue o projeto completo aqui: CRUD_LinqToSQL.zip

Joã 4:21 Disse-lhe Jesus: Mulher, crê-me, a hora vem, em que nem neste monte, nem em Jerusalém adorareis o Pai.

Joã 4:22 Vós adorais o que não conheceis; nós adoramos o que conhecemos; porque a salvação vem dos judeus.

Joã 4:23 Mas a hora vem, e agora é, em que os verdadeiros adoradores adorarão o Pai em espírito e em verdade; porque o Pai procura a tais que assim o adorem.

Referências:


José Carlos Macoratti