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 Paoni



No 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:

http://www.developer.com/net/net/article.php/3613531

http://www.vb4arab.com/vb/showthread.php?t=7750

Rodolfo Paoni

Rodolfo Paoni - Rodolfo Paoni - Desenvolvedor .NET - Twitter: @rodolfopaoni