Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Utilizando Stored Procedures

Um stored procedure (procedimento armazenado) é um conjunto de instruções em linguagem Transact-SQL, guardadas no servidor de forma pré-compilada. A execução pode ser feita dentro do próprio SQL ou através de uma aplicação externa, como é p caso do Visual Studio.

Os stored procedures têm algumas vantagens em relação aos comandos directos ao servidor, como é o caso de modularidade (simples de modificar sem alterar o código da aplicação), rapidez (ficam pré-compilados e ficarem em cache), entre outras, mas gostava de destacar a segurança e na protecção a ataques denominados SQL Injection.

Os SQL injection são instruções que manipulam a query, alterando a entrada de dados no servidor, através de uma aplicação externa. São uma das maiores causas de falhas de segurança das aplicações e podem destruir toda a estrutura de dados.

Para uma melhor percepção da importância dos stored procedures e da protecção aos SQL Injection, recomendo a visualização de um webcast gratuito, disponível na MSDN Brasil de Luciano Moreira: https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&EventID=1032383827&CountryCode=BR

A utilização de stored procedures em Visual Basic.Net é bastante simples. Cria-se a tabela, depois um novo stored procedure e para finalmente o código.

O seguinte exemplo mostra como criar um stored procedure e como é simples, através do código, mostrar, inserir, modificar ou apagar dados. Não serão mostrados todos os exemplos, uma vez que as principais diferenças estão nos comandos T-SQL e não propriamente no código.

Para o seguinte exemplo foi criada uma tabela simples, com o nome produtos, com três campos apenas:

 

ID               INT (primary key)

codigo        INT

produto       VARCHAR(50)

 

Um exemplo simples de um stored procedure para listar todos os dados da tabela produtos seria:

CREATE PROCEDURE dbo.sp_produtos
AS
BEGIN 
            SELECT * FROM produtos;
END


Após a gravação do stored procedure a instrução CREATE passa a ALTER, porque o que será feito posteriormente é uma alteração ao procedimento e não uma criação. Para o exemplo será feito um stored procedure um pouco mais complexo, que permita a pesquisa por código ou por produto (ou parte do nome).

/*
Stored Procedure que permite a pesquisa por
código ou nome (ou parte do nome) do produto
*/

CREATE PROCEDURE dbo.sp_produtos

            /** Indicação dos parâmetros de entrada com um valor por defeito
            o que permite que não sejam indicados através do código */

            @codigo INT = NULL
            @produto VARCHAR(50) = NULL       

AS
BEGIN 

            SELECT
            FROM produtos

           
-- Definição do filto da pesquisa
            WHERE (@codigo IS NULL OR codigo = @codigo) 
            AND (@produto IS NULL OR produto LIKE '%'+ @produto + '%');   

END

 
Depois no código de Visual Basic.Net:

        ' Informação da Connection String
        Dim myConnectionString As String = _
       "Data Source=.\SQLEXPRESS;AttachDbFilename='c:\myDatabase.mdf';Integrated Security=True;User Instance=True"

        ' Ligação à base de dados
        Using connection As New SqlConnection(myConnectionString)
            connection.Open()

            ' Indica o nome do Stored Procedure e que o tipo do comando
            Dim command As New SqlCommand("sp_produtos", connection)
            command.CommandType = CommandType.StoredProcedure 

            ' Caso o código tenha sido indicado 
            If txtCodigo.Text <> String.Empty Then
                command.Parameters.Add("@codigo", SqlDbType.Int).Value = txtCodigo.Text
            End If 

            ' Caso o produto tenha sido indicado 
            If txtProduto.Text <> String.Empty Then
                command.Parameters.Add("@produto", SqlDbType.VarChar).Value = txtProduto.Text
            End If

            ' Executa o comando e guarda o resultado no SqlDataReader
            Dim reader As SqlDataReader = command.ExecuteReader()

            ' Caso tenha resultados
            If reader.HasRows Then 

                ' Ciclo que irá mostrar os produtos encontrados
                While reader.Read
                    Dim result As String = _
                        String.Format("{0}-{1}-{2}", reader.Item(0), reader.Item(1), reader.Item(2))
                    Debug.WriteLine(result)
                End While

                Debug.WriteLine("Fim da pesquisa!") ' Informação no fim da pesquisa

            Else

                ' Caso não tenham sido encontrados produtos ...
                Debug.WriteLine("Não foram encontrados produtos!")

            End If

            reader.Close()
            reader = Nothing

        End Using   'connection


Este exemplo mostra como listar (na Immediate Window) os produtos de uma tabela, permitindo ou não, indicar dados de modo a estabelecer um filtro de pesquisa. Para inserir dados, modificar ou mesmo apagar é necessário adequar o stored procedure e o código é bastante semelhante, como já mostrado em artigos anteriores.


Este artigo pretende apenas mostrar, de uma forma geral, alguns dos benefícios dos stored procedures e a sua importância na melhoria de performance e segurança dos dados.

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

1 comentários:

Anónimo disse...

Boa Tarde

Como eu faria com o codigo explicado acima, imprimir pelo crystal reports ?



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico