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: