Este artigo mostra como
usar os recursos do LINQ to SQL em uma aplicação Windows Forms.
Ele foi baseado no artigo de autoria de Scott Lysle.
Embora o Entity
Framework tenha chegado para praticamente substituir o LINQ to
SQL com muitas vantagens, o LINQ to SQL ainda pode ser considerado
com uma alternativa viável para agilizar o desenvolvimento de
aplicações com acesso a dados.
O objetivo do artigo é
mostrar como acessar tabelas, consultas e stored procedures de
um banco de dados SQL Server (o LINQ to SQL só funciona com
ele) e também como realizar operações de alteração,
inclusão e exclusão de dados.
Para o exemplo do
artigo eu vou usar o banco de dados Northwind.mdf e a ferramenta
Visual C# 2008 Express Edition.
A estrutura do banco de
dados Northwind.mdf, exibindo suas tabelas, Views e Stored
Procedures é exibida na figura abaixo:
Vamos criar uma
aplicação Windows Forms e exibir contendo três
formulários:
- form1.cs – Onde
iremos exibir as tabelas, consultas e stored procedures
em um componente DataGridView; - form2.cs – Onde
iremos incluir/alterar um cliente; - form3.cs – Onde
iremos excluir um cliente.
01. O formulário form1.cs
irá exibir o resultado das consultas às tabelas,
querys e stored procedures em um controle
DataGridView e deverá
possuir um menu criado via controle MenuStrip conforme o leiaute
abaixo:
Para cada item do menu
vamos definir sub-itens conforme as figuras a seguir:
a. Consultas
b. Movimento
02. O formulário
form2.cs é exibido na figura abaixo e apresenta os controles
Label e TextBox para realizar a
alteração/inclusão na tabela
Customer:
03. O formulário
form3.cs, da figura abaixo, é usado para excluir um registro da
tabela Customer e possui o controle Label,
TextBox e Button:
Criando
o DataContext e
as classes com o código LINQ to SQL
Agora vamos criar a
infraestrutura usando classes onde devemos criar o código
usando LINQ to SQL. Antes, devemos realizar o mapeamento objeto
relacional para gerar as classes a partir das tabelas do
Northwind.
No menu Project -> Add
New Item
, selecione o template LINQ to SQL Classes, informe
o nome Northwind.dbml e clique em Add.
A seguir, arraste e
solte, a partir da janela DataBase Explorer, as tabelas do Northwind
para o descritor LINQ, a fim de gerar as classes com o
mapeamento ORM. Devemos arrastar também as stored procedures
Sales_by_Year e Ten_Most_Expensive_Products na painel de
métodos
do descritor, conforme a figura abaixo:
Com isso já temos todo
o mapeamento objeto relacional gerado e já podemos trabalhar com
as classes que representam as tabelas do nosso banco de dados.
Para isso eu poderia
criar uma classe e nela definir os métodos para acessar as
tabelas, consultas e stored procedures, e os métodos para
realizar alteração e inclusão, mas vou fazer diferente: vou
criar classes distintas para cada item. Assim, teremos as seguintes
classes:
-
acessoLinqTabelas.cs
– contém os métodos LINQ para acessar as tabelas
retornando todos os dados da tabela. Irei retornar os
dados para as seguintes tabelas:
Customers,Employees,
Orders, Categories e Products; - acessoLinqConsultas.cs
– contém os métodos LINQ para acessar as consultas: Orders by ID, Orders and Details e Employees by ID; - acessoLinqStoreProcedure.cs
– contém os métodos para acessar as stored procedures:
Sales by Year, Ten Most Expensive Products; - acessoLinqCrud.cs
– contém os métodos para realizar as operações de incluir, alterar e excluir registros da tabela Customers.
01.
Criando
a classe para acessar as tabelas
Vamos iniciar, então,
criando a classe para acessar as tabelas selecionando no menu
Project -> Add Class e informando o nome acessoLinqTabelas.cs;
A seguir, defina o
código abaixo na classe:
using System;
using System.Collections.Generic;
using
System.Linq;
using System.Text;
namespace LinqToSQL_Cshp1
{
class acessoLinqTabelas
{
///
/// Obtem dados da tabela Customer
///
summary> obtem; < returns> return
}
///
/// Obtem dados da tabela
Employee
///
///
public static
System.Data.Linq.Table GetEmployeeTable()
{
NorthwindDataContext dc = new
NorthwindDataContext();
return dc.GetTable< return
}
///
/// Obtem dados da
tabela Order
///
///
public static
System.Data.Linq.Table GetOrderTable()
{
NorthwindDataContext dc = new
NorthwindDataContext();
return dc.GetTable< return
}
///
/// Obtem dados da
tabela Category
///
///
public static
System.Data.Linq.Table GetCategoryTable()
{
NorthwindDataContext dc = new
NorthwindDataContext();
return dc.GetTable< return
}
///
/// Obtem dados da
tabela Product
///
///
public static
System.Data.Linq.Table GetProductTable()
{
NorthwindDataContext dc = new
NorthwindDataContext();
return dc.GetTable< return
}
}
}