VB .NET - Criando facilmente uma visão mestre-detalhes com LINQ to SQL


A plataforma .NET atualmente nos dá muitos recursos para realizar tarefas que antes dariam um bocado de trabalho para serem feitas.

Em aplicações que usam banco de dados é muito comum ter que exibir uma visão mestre-detalhes existente entre tabelas relacionadas.

Vamos pegar o banco de dados Northwind.mdf como exemplo e exibir o relacionamento existente entre as tabelas Orders, Order Details, Employees e Shippers conforme abaixo:

Vamos supor que precisamos exibir um visão mestre-detalhes em um formulário Windows Forms onde teremos o seguinte leiaute:

Vou mostrar que podemos obter o resultado acima com pouco esforço usando o LINQ to SQL.

O que LINQ To SQL ?

LINQ to SQL é uma implementação específica do LINQ para o SQL Server que converte consultas escritas em C# ou Visual Basic em SQL dinâmico , provendo uma interface que permite mapear os objetos do banco de dados gerando as classes para realizar as operações usando a sintaxe LINQ; também permite realizar alterações nos objetos e atualizar o banco de dados.

Nota: Se todos os fabricantes de banco de dados adotassem o padrão ANSI então poderíamos dizer que a LINQ To SQL poderia ser usada para todos os bancos de dados. No momento o LINQ To SQL só funciona como SQL Server. Mas a equipe do projeto LINQ esta trabalhando para que outros fornecedores de banco de dados façam a implementação para seus produtos.Vamos aguardar...(Em outro artigo irei abordar o LINQ To Entities que suporta um mapeamento mais flexível de objetos com outros bancos de dados relacionais através da extensão dos provedores ADO .NET.)

Vamos criar uma solução com dois projetos :

  1. Projeto L2S_NorthwindBaseVB - tipo class library que contém o mapeamento das tabelas do banco de dados para as classes usando o LINQ to SQL;
  2. Projeto MasterDetailLinqVB - tipo Windows Forms Application que usa os recursos do mapeamento criado via data context e cria a visão mestre-detalhes;

Crie uma nova solução usando o Visual Basic 2010 Express Edition com o nome : L2S_NorthwindBaseVB

Clique em File-> New Project e a seguir o template Class Library informando o nome L2S_NorthwindBaseVB;

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

Clique com o botão direito sobre o projeto e selecione Add New Item;

A seguir selecione o template LINQ to SQL Classes e informe o nome L2S_NorthwindBaseVB e clique em Add;

Abra o DataBase Explorer e ative a conexão com o banco de dados Northwind.mdf;

Arraste as tabelas do Banco de dados para janela do descritor LINQ to SQL;

As tabelas do banco de dados serão mapeadas como classes (campos como propriedades, procedures e funções como métodos)  e você terá no Descritor o conjunto de classes que representam o banco de dados;

Será criado o arquivo L2S_NorthwindBaseVB.dbml que contém o arquivo XML com informações sobre o leiaute das tabelas que foram mapeadas e também o descrito contendo as classes geradas pelo mapeamento. Após encerrar o mapeamento você já terá acesso aos recursos do LINQ To SQL com direito a intellisense completo das informações referente as tabelas mesmo sem conhecer nada sobre elas.

No projeto veremos também o arquivo app.Config contendo a string de conexão com o banco de dados:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="L2S_NorthwindBaseVB.My.MySettings.NorthwindConnectionString1"
            connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\Northwind.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <system.diagnostics>
.......

Criando o projeto Windows Forms

No menu File->Add->New Project selecione o template Windows Forms e informe o nome MasterDetailLinqVB;

Vamos agora criar um novo Data Source clicando no menu Data ->Add New Data Source ...

Selecione a opção Object e clique em Next>;

Clique no botão Add Reference e selecione o projeto LINQ to SQL;

A seguir, na janela Select the Data Objects, selecione o projeto L2S_NorthwindBaseVB e escolha a tabela Order e clique em Finish;

Agora vamos definir no formulário form1.vb criado no projeto a exibição dos dados conforme o leiaute definido;

Para isso clique no menu Data -> Show Data Sources...;

A seguir a partir da janela Data Sources vamos arraastar cada objeto para o formulário conforme indicado na figura abaixo:

Para completar vamos definir o código no formulário form1.vb;

Declare no início do formulário os seguintes namespaces:

Imports L2S_NorthwindBaseVB
Imports System.Data.Linq

A seguir vamos declarar uma instãncia do objeto data context:

Dim dc As L2SNorthwindDbDataContext

O DataContext é o gerenciador do mapeamento objeto relacional efetuado pelo LINQ entre as classes criadas e as tabelas do banco de dados que permite a realização de consultas e atualizações no banco de dados via sintaxe LINQ.

Agora no evento Load do formulário form1.vb inclua o seguinte código:

 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

     
  ' cria uma nova instancia do data context
        dc = New L2SNorthwindDbDataContext

     
  ' define o data source do binding source's para a tabela orders
        Me.OrderBindingSource.DataSource = dc.GetTable(Of Order)()

    End Sub

No evento Click do botão OrderBindingNavigatorSaveItem vamos definir o código para salvar as alterações conforme abaixo:

  Private Sub OrderBindingNavigatorSaveItem_Click(ByVal sender As System.Object,  ByVal e As System.EventArgs) Handles OrderBindingNavigatorSaveItem.Click

        Try
            Me.ValidateChildren()
            OrderBindingSource.EndEdit()
            dc.SubmitChanges()
            MessageBox.Show("Alterações Salvas, clique OK para continuar", "Salvar")
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erro ao salvar dados")
        End Try

    End Sub

Agora já temos tudo pronto para rodar a aplicação. Fazendo isso iremos obter:

E assim, temos uma visualização mestre-detalhes dos pedidos (orders) seus detalhes (order details) e também dos funcionários e de quem despachou o pedido.

Simples assim com LINQ to SQL...

Pegue o projeto completo aqui: L2S_NorthwindBaseVB.zip

Rom 12:19 Não vos vingueis a vós mesmos, amados, mas dai lugar à ira de Deus, porque está escrito: Minha é a vingança, eu retribuirei, diz o Senhor.

Rom 12:20 Antes, se o teu inimigo tiver fome, dá-lhe de comer; se tiver sede, dá-lhe de beber; porque, fazendo isto amontoarás brasas de fogo sobre a sua cabeça.

Rom 12:21 Não te deixes vencer do mal, mas vence o mal com o bem.

Referências:


José Carlos Macoratti