ASP . NET 2008 - LINQ To SQL - Insert , Update e Delete


Este artigo tem o objetivo de mostrar como você pode usar LINQ To SQL para realizar operações de insert, update e delete em uma base de dados SQL Server em ASP .NET. Você vai notar que o código necessário para efetuar tais tarefas é bem simples e que não é necessário conhecer quase nada sobre SQL , XML e ADO .NET.

Os requisitos para você reproduzir o exemplo deste artigo são:

  1. Visual Web Developer 2008 Express - http://msdn2.microsoft.com/pt-br/express/future/default.aspx
  2. Banco de dados Northwind.mdf - http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en

Nota: Veja também o meu artigo : http://www.macoratti.net/07/10/aspn_vwd.htm

Se você não sabe nada sobre LINQ leia os meus artigos:

Por padrão LINQ To SQL gera de forma dinâmica as instruções SQL para implementar operações de insert, read, upate e delete. Tudo o que você tem que fazer é usar o framework LINQ To SQL no seu projeto e saber usar a sintaxe da linguagem LINQ To SQL que é parecida com a SQL.

Abra o Visual Web Developer 2008 Express e no menu File selecione a opção New Web Site;

Na janela Templates selecione o template ASP .NET Web Site e informe o nome uLinqToSQL1;

Vamos definir uma conexão com o banco de dados Northwind.mdf ; se a conexão ainda não existir no seu ambiente faça o seguinte:

1- No menu View e selecione DataBase Explorer e clique com o botão direito do  mouse sobre o item Data Connections e selecione Add Connection...

2- Na janela Add Connection Clique no botão Browse e selecione o banco de dados Northwind.mdf a partir do local onde você o instalou e clique no botão Abrir;

Será solicitada a confirmação para que o banco de dados seja usado localmente na pasta App_Data. Confirme.

Agora vamos incluir a referência ao LINQ To SQL através do template LINQ To SQL Classes;

No menu Project opção Add New Item selecione na janela Templates o template LINQ to SQL Classes alterando o nome para Northwind.dbml pois iremos usar o mapeamento com as tabelas Products e Categories do banco de dados Northwind.mdf;

Será solicitada a confirmação para que o arquivo Northwind.dbml seja criado na pasta App_Code. Confirme.

A janela do Descritor Objeto Relacional irá surgir . Abra a janela DataBase Explorer , expanda os objetos do banco de dados Northwind.mdf e arraste e solte as tabelas Categories e Products para o Descritor Objeto Relacional como na figura abaixo;

Selecione a página Default.aspx e inclua os componentes: 3 Buttons, 1 GridView e 1 Label , conforme o leiaute exibido abaixo:

Em cada um dos botões, no evento Click, vamos inserir o código pertinente a cada ação que desejamos que seja executada:

1- Botão Consulta: Chama a rotina exibeDados() e limpa o texto da Label.

Protected Sub btnConsulta_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnConsulta.Click

   exibeDados()

   Label1.Text = ""

End Sub

A rotina exibeDados(): Usa o DataContext criado para acessar via LINQ To SQL os dados da tabela Products e exibi-los no GridView.

Private Sub exibedados()
 

Dim db As New NorthwindDataContext


Dim
produtos = From p In
db.Products _

                       Where p.Category.CategoryName = "SeaFood" _

                               Order By p.ProductID _

                               Select p.ProductID, p.ProductName, p.Category.CategoryName, p.UnitPrice
 

GridView1.DataSource = produtos

GridView1.DataBind()


End
Sub

2- Botão Incluir: Atribui novos valores aos campos ProductName, UnitPrice e CategoryID , usa os métodos InsertOnSubmit(p) e SubmitChages().

Protected Sub btnIncluir_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnIncluir.Click

 

Dim db As New NorthwindDataContext

 

Dim p As New Product With {.ProductName = "Bacalhau do Porto", .UnitPrice = 3.99, .CategoryID = 8}

 

db.Products.InsertOnSubmit(p)

db.SubmitChanges()

 

exibedados()

 

End Sub

Você inclui linhas em um banco de dados adicionando objetos a coleção Table<Of <T.> associada do LINQ To SQL e em seguida submetendo as alterações ao banco de dados. O LINQ To SQL traduz as alterações realizada em comandos de inclusão SQL (INSERT)  apropriados.

No exemplo comando InsertOnSubmit inclui um novo objeto a coleção de Produtos incluindo uma entidade em um estado pendente de inclusão para esta tabela.

A inclusão deve ser efetivada através da chamada do método SubmitChanges() que computa o conjunto de objetos modificados a ser incluído, alterado ou excluídos e executa o comando apropriado para implementar as alterações no banco de dados.

3- Botão Atualizar:  Localiza a única ocorrência do produto com o nome "Bacalhau do Porto" , altera o seu preço e atualiza a base de dados através do método SubmitChages().

Nota: A localização única deveria ser feita pela chave primária e não pelo nome do produto como eu implementei. Fiz assim por ser mais fácil por que o objetivo era mostrar a atualização dos dados.

Protected Sub btnAtualizar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAtualizar.Click


Dim db As New NorthwindDataContext


Try

      Dim p1 = (From p In db.Products _

                           Where p.ProductName.Contains("Bacalhau do Porto") _

                           Select p).Single

 

       p1.UnitPrice = p1.UnitPrice * 2

 

       db.SubmitChanges()

 

Catch ex As Exception

     Label1.Text = "Erro ao atualizar dados"

End Try

 

exibedados()

End Sub

Após modificar os valores dos objetos associados com a coleção Table(TEntity) do LINQ To SQL submetemos as alterações ao banco de dados.  O LINQ To SQL traduz as alterações para comandos SQL apropriados (UPDATE)

Nota:  Table(TEntity) representa uma tabela para um tipo particular no banco de dados relacionado permitindo consultas , incluindo objetos, removendo objetos e anexando objetos.

4- Botão Excluir:  Localiza a a primeira ocorrência do Produto cujo nome seja "Bacalhau do Porto" , aciona o método DeleteOnSubmit e atualiza o banco de dados através do método SubmitChages().

Protected Sub btnExcluir_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExcluir.Click


Dim db As New NorthwindDataContext


Dim p1 = db.Products.First(Function(p) p.ProductName = "Bacalhau do Porto")

 

db.Products.DeleteOnSubmit(p1)
 

db.SubmitChanges()

 

exibedados()

 

End Sub

Para deletar linhas em um banco de dados você deve remove o objeto LINQ To SQL correspondente da sua coleção tabela-objeto relacional.  O método DeleteOnSubmit põe uma entidade da tabela em um estado pendente de exclusão.  O LINQ To SQL traduz as alterações para comandos SQL apropriados (DELETE)

Não há suporte no LINQ To SQL para exclusão em cascata. Se você deseja excluir uma linha em uma tabela que possui uma restrição(constraint) você deve primeiro fazer o seguinte:

Executando a página e realizando algumas operações iremos obter a página abaixo:

Pegue o projeto completo aqui :    usandoLINQToSQL1.zip

Até o próximo artigo ASP .NET ...


José Carlos Macoratti