Banco de Dados - SQL Server
Introdução ao LINQ - Parte III (LINQ to SQL - Stored Procedures)
Este artigo tem como objetivo apresentar o LINQ to SQL e suas funcionalidades básicas e criar uma aplicação Windows Form, que permita realizar as operações SELECT, INSERT, UPDATE e DELETE em um banco SQL Server 2005 Express via LINQ to SQL, utilizando Stored Procedures.
por Rodolfo PaoniNo primeiro artigo desta série, apresentei o funcionamento básico do LINQ, a sintaxe e como criar um projeto no Visual Studio 2008 Express utilizando esta tecnologia. No segundo artigo, apresentei o funcionamento do LINQ to SQL para operações DML (Data Manupulation Language) básicas. Vale ressaltar que pode ser utilizada tanto a linguagem VB.NET quanto a linguagem C#.
Este artigo tem como objetivo apresentar o LINQ to SQL e suas funcionalidades básicas e criar uma aplicação Windows Form, que permita realizar as operações SELECT, INSERT, UPDATE e DELETE em um banco SQL Server 2005 Express via LINQ to SQL, utilizando Stored Procedures.
Tecnologias utilizadas:
Visual Studio 2008 Express (VB 2008 Express);
.NET Framework 3.5;
SQL Server 2005 Express;
SQL Server Management Studio 2005 Express;
Banco de dados exemplo Northwind.
Crie um novo projeto no Visual Studio 2008 chamado linqToSQL (ou qualquer outro nome de sua preferência).
Adicione um novo form chamado frmNorthwind e inclua um controle DataGridView e 4 buttons de acordo que fique desta maneira:
Abra o SQL Server Management Studio Express, adicione uma conexão com o banco Northwind, clique com o botão direito e vá em New query e execute o seguinte script:
IF EXISTS (SELECT * FROM sysobjects WHERE name = "SelectCustomers" AND user_name(uid) = "dbo")
DROP PROCEDURE dbo.[SelectCustomers]
GO
CREATE PROCEDURE dbo.[SelectCustomers]
AS
SET NOCOUNT ON;
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM dbo.Customers
GO
IF EXISTS (SELECT * FROM sysobjects WHERE name = "InsertCustomers" AND user_name(uid) = "dbo")
DROP PROCEDURE dbo.InsertCustomers
GO
CREATE PROCEDURE dbo.InsertCustomers
(
@CustomerID nchar(5),
@CompanyName nvarchar(40),
@ContactName nvarchar(30),
@ContactTitle nvarchar(30),
@Address nvarchar(60),
@City nvarchar(15),
@Region nvarchar(15),
@PostalCode nvarchar(10),
@Country nvarchar(15),
@Phone nvarchar(24),
@Fax nvarchar(24)
)
AS
SET NOCOUNT OFF;
INSERT INTO [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, @Region, @PostalCode, @Country, @Phone, @Fax);
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM Customers WHERE (CustomerID = @CustomerID)
GO
IF EXISTS (SELECT * FROM sysobjects WHERE name = "UpdateCustomers" AND user_name(uid) = "dbo")
DROP PROCEDURE dbo.UpdateCustomers
GO
CREATE PROCEDURE dbo.UpdateCustomers
(
@CustomerID nchar(5),
@CompanyName nvarchar(40),
@ContactName nvarchar(30),
@ContactTitle nvarchar(30),
@Address nvarchar(60),
@City nvarchar(15),
@Region nvarchar(15),
@PostalCode nvarchar(10),
@Country nvarchar(15),
@Phone nvarchar(24),
@Fax nvarchar(24),
@Original_CustomerID nchar(5)
)
AS
SET NOCOUNT OFF;
UPDATE [dbo].[Customers] SET [CustomerID] = @CustomerID, [CompanyName] = @CompanyName, [ContactName] = @ContactName, [ContactTitle] = @ContactTitle, [Address] = @Address, [City] = @City, [Region] = @Region, [PostalCode] = @PostalCode, [Country] = @Country, [Phone] = @Phone, [Fax] = @Fax WHERE (([CustomerID] = @Original_CustomerID));
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM Customers WHERE (CustomerID = @CustomerID)
GO
IF EXISTS (SELECT * FROM sysobjects WHERE name = "DeleteCustomers" AND user_name(uid) = "dbo")
DROP PROCEDURE dbo.DeleteCustomers
GO
CREATE PROCEDURE dbo.DeleteCustomers
(
@Original_CustomerID nchar(5)
)
AS
SET NOCOUNT OFF;
DELETE FROM [dbo].[Customers] WHERE (([CustomerID] = @Original_CustomerID))
GO
Resultado da execução:
Este script basicamente cria 4 Stored Procedures (SelectCustomer, InsertCustomer, UpdateCustomer e DeleteCustomer) que utilizaremos um pouco mais à frente.
Agora, no Visual Studio, clique com o botão direito em cima do projeto e adicione um DataContext chamado Northwind.dbml
Arraste a tabela Customers para o descritor Object Relational Mapping e as Stored Procedures que criamos com o nosso script, para a janela Panel Methods, obtendo o seguinte resultado:
Criaremos agora uma classe chamada BLL, para ser utilizada em nossa interface. Não se trata de uma classe de regras de negócio completa. A idéia aqui é mostrar a simplicidade que se pode atingir utilizando esta abordagem. Você pode colocar qualquer outro nome. Simplesmente utilizamos os métodos correspondentes associados ao DataContext gerado.
Public Shared Function SelectCustomers()
Dim db As New NorthwindDataContext
Dim customers = From c In db.SelectCustomers
Return customers.ToList
End Function
Public Shared Sub InsertCustomers(ByRef c As Customer)
Dim db As New NorthwindDataContext
db.InsertCustomers(c.CustomerID, c.CompanyName, c.ContactName, c.ContactTitle, _
c.Address, c.City, c.Region, c.PostalCode, c.Country, c.Phone, c.Fax)
End Sub
Public Shared Sub UpdateCustomers(ByRef c As Customer)
Dim db As New NorthwindDataContext
db.UpdateCustomers(c.CustomerID, c.CompanyName, c.ContactName, c.ContactTitle, _
c.Address, c.City, c.Region, c.PostalCode, c.Country, c.Phone, c.Fax, c.CustomerID)
End Sub
Public Shared Sub DeleteCustomers(ByRef c As Customer)
Dim db As New NorthwindDataContext
db.DeleteCustomers(c.CustomerID)
End Sub
Temos então, métodos para SELECT, INSERT, UPDATE e DELETE, utilizando internamente os métodos que foram mapeados das Stored Procedures na janela Panel Methods.
Agora apresentamos o código do formulário principal, onde simplesmente declaramos um objeto do tipo Customer, utilizando um novo recurso do .NET Framework 3.5 chamado Object Initiazers (Inicializadores de objetos), onde podemos definir as propriedades do objeto no momento da declaração, simplificando a leitura e não havendo necessidade de sobrecarregarmos o construtor da classe.
Inicialmente declaro a instância do DataContext:
Dim db As New NorthwindDataContext()
Por fim, definimos as chamadas de eventos para cada botão, associando-os à regra de negócio correspondente.
Dim c As New Customer With {.Address = "Floriano", .City = "Petrópolis", .CompanyName = "LNCC", .ContactName = "Rodolfo Paoni", .ContactTitle = "rpaoni", .Country = "Brazil", .CustomerID = "RPAON", .Fax = "9999", .Phone = "9999", .PostalCode = "9999", .Region = "Sudeste"}
Private Sub btnSelect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelect.Click
‘Preenchendo o DataGridView
dgSource.DataSource = Bll.SelectCustomers()
End Sub
Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsert.Click
Bll.InsertCustomers(c)
‘Preenchendo o DataGridView
dgSource.DataSource = Bll.SelectCustomers()
End Sub
Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
c.ContactName = "Rodolfo Paoni Viçoso"
Bll.UpdateCustomers(c)
‘Preenchendo o DataGridView
dgSource.DataSource = Bll.SelectCustomers()
End Sub
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
Bll.DeleteCustomers(c)
‘Preenchendo o DataGridView
dgSource.DataSource = Bll.SelectCustomers()
End Sub
Inserindo um cliente:
Atualizando um cliente:
Bem, vou ficando por aqui e você pode incrementar um pouco a aplicação, com tratamento de erros e etc. O objetivo era mostrar a idéia básica do funcionamento do LINQ to SQL, utilizando Stored Procedures. Bons estudos!
Até a próxima!
Referências:
- Representando dados em XML no SQL ServerSQL Server
- Diferenças entre SEQUENCES x IDENTITY no Microsoft SQL Server 2012SQL
- Utilizando FILETABLE no SQL Server 2012SQL Server
- NHibernate com o Delphi Prism: Acessando um Banco de Dados SQL ServerVisual Studio
- Novidades no SQL Server Codinome DenaliSQL Server