Neste artigo vou mostrar como podemos atualizar uma base de dados SQL Server usando o LINQ to SQL com Ajax em uma aplicação ASP .NET Web Forms usando a linguagem C#. |
O LINQ to SQL é uma implementação específica da 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.
Para usar o LINQ To SQL em suas aplicações basta incluir uma referência usando o template LINQ To SQL classes. Fazendo isso você terá acesso ao Descritor Objeto Relacional ou Object Relational Designer (O/R Designer).
O Descritor Objeto Relacional - Object Relational Designer (O/R Designer) - fornece uma interface visual para criar e editar classes LINQ to SQL, as classes das entidades são baseadas em objetos do banco de dados.
O descritor O/R é usado para criar um modelo de objetos na aplicação que efetua o mapeamento para os objetos do banco de dados gerando um DataContext fortemente tipado que é usado para enviar e receber dados entre as classes das entidades e o banco de dados; além disso o descritor O/R também permite efetuar o mapeamento de stored procedures e funções para o métodos do DataContext com o intuito de retornar e popular as classes das entidades provendo ainda a habilidade de desenhar relacionamentos herdados entre as classes das entidades.
A classe DataContext é uma classe LINQ to SQL que atua como uma ponte entre o banco de dados SQL Server e as classes das entidades LINQ To SQL mapeadas para o banco de dados. Ela contém a informação e os métodos para efetuar a conexão com o banco de dados e manipular os dados.
Essa classe possui diversos métodos que você pode chamar, como o método SubmitChanges que envia as atualizações das classes LINQ To SQL para o banco de dados.
Além disso você pode criar métodos adicionais na classe DataContext para mapear stored procedures e funções de forma que executando os métodos criados as stored procedures e as funções que foram mapeadas pela classe DataContext serão executadas.
Vamos criar uma aplicação ASP .NET Web Forms, um banco de dados SQL Server e uma tabela, e, usando o LINQ to SQL, mapear os objetos do banco de dados para classes e usar a sintaxe LINQ para gerenciar os dados.
Recursos usados:,
SQL Server 2012 Express
Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.
Criando a solução no VS Community 2015
Abra o VS Community 2015 e clique em New Project;
Selecione a linguagem Visual Basic -> Web e o template ASP .NET Web Application;
Informe o nome AspNet_Linq_AJax e clique no botão OK;
A seguir escolha o template Empty e marque a opção Web Forms, sem autenticação nem hospedagem na nuvem:
Incluindo um novo Banco de dados SQL Server no Projeto
No menu Project clique em Add New Item;
Clique na guia Data e selecione o item SQL Server DataBase, e, informe o nome Cadastro.mdf e clique no botão Add;
Confirme criação da pasta App_Data para armazenar o banco de dados.
Criando a tabela Alunos no banco de dados
A seguir na janela Server Explorer clique com o botão direito sobre a pasta Tables do banco de dados Cadastro e a seguir em Add New Table;
Crie uma tabela com os campos : Id, Nome , Email e Cidade conforme a estrutura mostrada a baixo.
O campo Id é uma chave primária do tipo Identity (auto-incremental):
Salve a tabela com o nome Alunos.
Incluindo a referência ao LINQ to SQL e criando o modelo de entidades
No menu Project clique em Add New Item;
Clique na guia Data e selecione o item LINQ to SQL Classes e informe o nome CadastroModel.dbml e clique no botão Add;
A seguir, arraste a partir da janela Server Explorer no descritor LINQ to SQL, a tabela Alunos, para criar a classe Aluno conforme mostra a figura abaixo:
Salve e compile o projeto.
Criando a interface com o usuário
Abra o arquivo Default.aspx e a partir da ToolBox e inclua os seguintes controles na página Default.aspx:
Após incluir o controle passe para o modo Design e clique em Configure Data Source :
Selecione a tabela Alunos e os campos que vamos usar, como mostrado a seguir, e clique no botão Finish:
No componente LinqDataSource habilite as opções : Enable Delete, Enable Insert e Enable Update:
O código gerado é visto abaixo:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Aspnet_Linq_Ajax.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:LinqDataSource ID="LinqDataSource1" runat="server"
ContextTypeName="Aspnet_Linq_Ajax.Models.CadastroModelDataContext"
EnableDelete="True"
EnableInsert="True"
EnableUpdate="True"
EntityTypeName=""
TableName="Alunos">
</asp:LinqDataSource>
</div>
</form>
</body>
</html>
|
A seguir inclua um controle GridView(gdvDados) na página Default.aspx e em Choose Data Source selecione o controle LinqDataSource1, e configure-o conforme a figura abaixo:
Vamos fazer a implementação para a inclusão de dados.
Para isso inclua uma tabela com 3 TextBox : txtNome, txtEmail e txtCidade , 1 Button : btnEnviar, e 1 Label : ID=lblmsg ,conforme mostra o código abaixo:
... <hr /> <table> <tr><td>Nome:</td><td><asp:TextBox ID="txtNome" runat="server"></asp:TextBox></td></tr> <tr><td>Email:</td><td><asp:TextBox ID="txtEmail" runat="server"></asp:TextBox></td></tr> <tr><td>Cidade:</td><td><asp:TextBox ID="txtCidade" runat="server"></asp:TextBox></td></tr> <tr><td colspan="2"><asp:Button ID="btnEnviar" runat="server" Text="Adicionar Dados" onclick="btnEnviar_Click" /></td></tr> <tr><td> <asp:Label ID="lblmsg" runat="server" Font-Bold="True" ForeColor="#CC0000"></asp:Label> </td></tr> </table> <br /> ... |
O leiaute da página Default.aspx e visto a seguir:
Agora vamos implementar o código no evento Click do botão - Adicionar Dados :
Defina no início do arquivo Default.aspx.vb os seguintes namespaces:
using Aspnet_Linq_Ajax.Models; using System; using System.Configuration;
A seguir no evento Click do botão Adicionar Dados inclua o código abaixo: (Versão C# e VB .NET)
protected void btnEnviar_Click(object sender, EventArgs e)
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["CadastroConnectionString"].ToString();
CadastroModelDataContext dataContext = new CadastroModelDataContext(connectionString);
Aluno tbl = new Aluno();
tbl.Nome = txtNome.Text;
tbl.Email = txtEmail.Text;
tbl.Cidade = txtCidade.Text;
dataContext.Alunos.InsertOnSubmit(tbl);
dataContext.SubmitChanges();
gdvDados.DataBind();
}
catch (Exception ex)
{
lblmsg.Text = " Erro : " + ex.Message;
}
}
|
Protected Sub btnEnviar_Click(sender As Object, e As EventArgs)
Try
Dim connectionString As String = ConfigurationManager.ConnectionStrings("CadastroConnectionString").ToString()
Dim dataContext As New CadastroModelDataContext(connectionString)
Dim tbl As New Aluno()
tbl.Nome = txtNome.Text
tbl.Email = txtEmail.Text
tbl.Cidade = txtCidade.Text
dataContext.Alunos.InsertOnSubmit(tbl)
dataContext.SubmitChanges()
gdvDados.DataBind()
Catch ex As Exception
lblmsg.Text = " Erro : " + ex.Message
End Try
End Sub
|
Neste código estamos obtendo a string de conexão usando o ConfigurationManager a partir do nome gerando no arquivo Web.Config.
A seguir criamos uma instância do objeto CadastroModelDataContext do tipo DataContext que contém as informações da conexão e do mapeamento entre o banco de dados e as classes de entidades criadas.
Criamos uma instância da classe Aluno que foi mapeada para tabela Alunos e atribuímos os dados informados nas caixas de texto.
A seguir usamos o método InsertOnSubmit() para incluir o novo objeto no Contexto e a seguir sensibilizamos o banco de dados usando o método SubmitChanges().
Neste momento já temos a implementação concluída e nossa aplicação estará funcional mas vamos agora usar os recursos do Ajax para fornecer uma experiência com o usuário melhor.
Implementando os recursos do AJAX : ScriptManager, UpdatePanel e AsyncPostBackTrigger.
Agora que temos nossa aplicação funcionando vamos melhorar seu desempenho incluindo os recursos do AJAX.
Vamos começar incluindo um objeto do tipo ScriptManager na sua página Default.aspx. A função do ScriptManager é gerenciar a ação de todos os controles AJAX na página.
A seguir inclua um objeto UpdatePanel que vai permitir que você crie aplicações web com uma interface mais interativa e amigável com o usuário.
Usando este controle você pode atualizar partes selecionadas de uma página ao invés de atualizar toda a página web usando um postback.(efetuar uma atualização parcial da página - partial-page update).
Você pode usar um ou mais controles UpdatePanel em uma página que já contenha o controle ScriptManager que podem participar de atualizações parciais da página sem ter que criar código de script do lado do cliente.
O controle UpdatePanel do ASP.NET AJAX é um controle de servidor e ao usá-lo o comportamento da página é independente do Navegador usado e pode reduzir potencialmente a quantidade de dados que é transferido entre o cliente e o servidor.
Este controle atua definindo regiões específicas de uma página que podem ser atualizadas sem dar um refresh na página inteira. Este processo é coordenado pelo controle de servidor ScriptManager e pela classe PageRequestManager no lado do cliente. Quando uma atualização parcial esta ativa, os controles podem enviar posts de forma assíncrona para o servidor.
Não há limite no número de controles UpdatePanel que você pode usar em uma página e você pode usar mais de um controle para atualizar regiões diferentes da página de forma independente.
Qualquer postback efetuado dentro de um controle UpdatePanel causa um postback assíncrono e atualiza o conteúdo do painel, mas você pode também configurar outros controles na página para atualizar o controle UpdatePanel através da definição de um gatilho (trigger) para o controle. (Um gatilho (trigger) é uma vinculação que especifica qual controle e evento irá causar a atualização do UpdatePanel em um postback.)
Um gatilho é definido pela utilização do elemento <asp:AsyncPostBackTrigger ControlID="ControleID" /> no interior do elemento <Triggers> do controle UpdatePanel sendo que sua utilização é opcional.
Vamos então incluir um trigger para o nosso botão de comando btnEnviar definindo o código conforme mostrado a seguir:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Aspnet_Linq_Ajax.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnEnviar" EventName="Click" />
</Triggers>
<ContentTemplate>
<div>
<asp:LinqDataSource ID="LinqDataSource1" runat="server"
ContextTypeName="Aspnet_Linq_Ajax.Models.CadastroModelDataContext"
EnableDelete="True"
EnableInsert="True"
EnableUpdate="True"
EntityTypeName=""
TableName="Alunos">
</asp:LinqDataSource>
<asp:GridView ID="gdvDados" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False"
DataKeyNames="Id" DataSourceID="LinqDataSource1" Height="243px" Width="495px" BackColor="#DEBA84" BorderColor="#DEBA84"
BorderStyle="None" BorderWidth="1px" CellPadding="3" CellSpacing="2">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" CancelText="Cancela"
DeleteText="Deleta" EditText="Edita" InsertText="Inserir" NewText="Novo" SelectText="Seleciona" UpdateText="Atualiza" />
<asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True" SortExpression="Id" />
<asp:BoundField DataField="Nome" HeaderText="Nome" SortExpression="Nome" />
<asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
<asp:BoundField DataField="Cidade" HeaderText="Cidade" SortExpression="Cidade" />
</Columns>
<FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
<HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
<PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
<RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
<SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
<SortedAscendingCellStyle BackColor="#FFF1D4" />
<SortedAscendingHeaderStyle BackColor="#B95C30" />
<SortedDescendingCellStyle BackColor="#F1E5CE" />
<SortedDescendingHeaderStyle BackColor="#93451F" />
</asp:GridView>
<hr />
<table>
<tr><td>Nome:</td><td><asp:TextBox ID="txtNome" runat="server"></asp:TextBox></td></tr>
<tr><td>Email:</td><td><asp:TextBox ID="txtEmail" runat="server"></asp:TextBox></td></tr>
<tr><td>Cidade:</td><td><asp:TextBox ID="txtCidade" runat="server"></asp:TextBox></td></tr>
<tr><td colspan="2"><asp:Button ID="btnEnviar" runat="server" Text="Adicionar Dados" onclick="btnEnviar_Click" /></td></tr>
<tr><td>
<asp:Label ID="lblmsg" runat="server" Font-Bold="True" ForeColor="#CC0000"></asp:Label>
</td></tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
|
Agora ao atualizar os dados haverá uma atualização parcial da página e não total.
Executando o projeto iremos obter o seguinte resultado após clicar no botão para exportar:
Ao clicar no botão Adicionar Dados os dados serão incluídos e a tela não vai 'piscar' parecendo uma atualização quase instantânea.
Pegue o projeto completo aqui: Aspnet_Linq_Ajax.zip
Até o próximo artigo...
Não se turbe o vosso coração; credes em
Deus, crede também em mim.
Na casa de meu Pai há muitas moradas; se não fosse assim, eu vo-lo teria dito.
Vou preparar-vos lugar.
João 14:1,2
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências: