Desenvolvimento - C#

Trabalhando com Procedures no .NET

Neste artigo apresento um aplicativo de cadastro de usuários utilizando a linguagem C# presente na plataforma .NET na versão 3.5 do framework com Visual Studio 2008 utilizando Procedures. O artigo é direto e apresenta a codificação de todas as classes.

por Fabrício Lopes Sanchez



Procedures são recursos interessantes e amplamente utilizandos no desenvolvimento de aplicativos por vários motivos. O principal destes motivos é que, uma procedure éum código independente que fica pré-compilado no servidor de banco de dados, assim,retiramos a onerosidade de processamento da aplicação ea passamos para o servidor sendo que, aaplicação, apenas recebe o resultado do processamento destas procedures e continua seu fluxo de execução.

Neste artigo, apresento de forma simples e direta como podemos utilizar procedures em conjunto com a linguagem C# da plataforma .NET para efetuarmos uma inserção de usuário no banco de dados e, posteriormente, apresentar na tela se o registro foi inserido com sucesso ou não. Este exemplo é baseado no modelo em camadas.

Bom vamos lá, mãos a obra. Vamos então criar o projeto. Após criar as camadas, as classes de cada camada e configurar as referências das mesmas, sua Solution Explorer deve se parecer com aquela apresentada na Figura 1:

se1.jpg

Figura 1: Solution Explorer da Solution UsuarioProcedure

Não vou entrar em detalhes sobre a criação do projeto e configuração das camadas pois não é o objetivo deste artigo. Em um futuro próximo escreverei um artigo aqui só abordando o desenvolvimento de camadas. Basicamente, o que fiz para chegar a Solution Explorer acima foi criar uma Blank Solution,nomeá-la para "UsuarioProcedure",adicionar três novos projetos (um dos projetos web e os outros dois do tipo Class Library) e configurar suas referências.

Com nosso projeto criado e configurado, vamos então a implementação das classes. Vamos começar a trabalhar da camada mais baixa para a camada mais alta, ou seja, implementaremos em primeira instância a classe clsDados.cs. A Listagem 1 apresenta o código desta classe.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.Sql;

using System.Data.SqlClient;

namespace Core.DAL

{

    public class clsDados

    {

        #region ------------------ ATRIBUTOS DA CLASSE DADOS -------------------

        private static string stringConexao = @"Data Source=FABRÍCIO-PC;Initial Catalog=db_Teste;User ID=sa;Password=shell";
        private static SqlConnection conexaoDecup = new SqlConnection(stringConexao);

        #endregion

        #region ------------------ MÉTODOS ------------------

        ///

        /// Este método encerra a conexão com o Banco de Dados.

        ///

        public SqlConnection fechaConexao()

        {

            if (conexaoDecup.State == ConnectionState.Open)

            {

                conexaoDecup.Close();

            }

            return conexaoDecup;

        }

        ///

        /// Este método verifica o status da conexão com o Banco de Dados. Caso esta esteja fechada, o método abre a conexão.

        ///

        public SqlConnection abreConexao()

        {

            if (conexaoDecup.State == ConnectionState.Closed)

            {

                conexaoDecup.Open();

            }

            return conexaoDecup;

        }

        #endregion

    }

}

Listagem 1: Fonte da classe clsDados

Novamente não entrar nos detalhes da implementação da classe por não ser o objetivo deste artigo, entretanto, algumas características da mesma precisam de um pouco mais de nossa atenção. Primeiramente, as linhas abaixo:

private static string stringConexao = @"Data Source=FABRÍCIO-PC;Initial Catalog=db_Teste;User ID=sa;Password=shell";
private static SqlConnection conexaoDecup = new SqlConnection(stringConexao);

Nas linhas acima criamosumavariável e um objeto respectivamente: stringConexao e conexaoDecup. Como podemos notar, stringConexao recebe a string de conexão com a base SQL Server. Em seguida, o objetoconexaoDecup estabelece a conexão com a base através do construtor da classe SqlConnection.

Outro aspecto importante a ressaltar neste código é a criação de dois métodos - fechaConexao() e abreConexao(). Estes métodos serão os responsáveis por abrir a conexão com a base de dados e fechá-la em um momento posterior respectivamente.

Como já foi dito, o foco deste artigo é apresentar a utilização das procedures em conjunto com a linguagem C#. Para apresentar esta funcionalidade, iremos realizar uma inserção de registro no banco utililzando uma procedure. A estrutura da tabela onde o registro será inserido pode ser visualizada na Figura 2:

se2.jpg

Figura 2: Estrutura da tabelasobre a qual a procedure trabalhará

Bom, agora que conhecemos a estrutura da tabela tbUsuarios já possuímos as informações necessárias para criarmos nossa procedure. Para isso, na base de dados expanda a guia Programmability. Em seguida, clique com o botão direito sobre a pasta Stored Procedure e selecione a opção New Stored Procedure, conforme apresenta a Figura 3:

se3.jpg

Figura 3: Criando uma nova Stored Procedure

Ao selecionar esta uma opção, uma nova query será criada com algumas sugestões do SQL Server para criar a procedure. Limpe as sugestões do SQL Server de modo que sua tela fique semelhante a Figura 4.

se4.jpg
Figura 4: Tela de criação da procedure limpa

Vamos então criar a procedure. A Listagem 3 apresenta o código da SP (Stored Procedure) de inserção do usuário:

CREATE PROCEDURE ____Inserir_Usuario

               

                -- Parâmetros de entrada da procedure

                @NomeUsuario VARCHAR(100),

                @EmailUsuario VARCHAR(100),

                @UsuarioUsuario VARCHAR(20),

                @SenhaUsuario VARCHAR(10)

AS

BEGIN

               

                -- Inserindo o registro no banco

                INSERT INTO dbo.tbUsuarios(Nome, Email, Usuario, Senha)

                VALUES(@NomeUsuario, @EmailUsuario, @UsuarioUsuario, @SenhaUsuario)

END

GO

Listagem 3: Código fonte da SP de Inserção

O código da SP dispensa muitos comentários pois é relativamente simples. O que este trecho que código faz é simplesmente alocar quatro variáveis (parâmetros):@NomeUsuario, @EmailUsuario, @UsuarioUsuario e @SenhaUsuario. Estes parâmetros receberão os valores provenientes do método C# e os passarãoo segundo bloco do código para inserção na SP. Como já mencionado no início deste artigo, as procedures ficam pré-compiladas no servidor de banco de dados, portanto, precisamos agora compilar a SP. Para isso, basta ir até o menu superior do SQL Server Management Studio e clicar na opção "Execute" ou simplesmente selecionar o código da SP e pressionar F5. Se tudo ocorreu bem, você deverá visualizar uma tela semelhante a apresentada na Figura 5:

se5.jpg

Figura 5: Sucesso no processo de compilação da SP

Muito bem, criada a tabela de usuários onde iremos inserir o registro, criada e compilada a procedure que fará a inserção e criada e implementada a classe de acesso a dados na camada DAL, vamos agora até a camada de negócios (BLL) e implementar o método responsável por chamar a SP e passar os parâmetros para a mesma. A Listagem 4 apresenta o código da classe clsUsuario.cs.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.Sql;

using System.Data.SqlClient;

using Core.DAL;

using System.Net;

namespace Core.BLL

{

    public class clsUsuario

    {

        ///

        /// Método que recebe os valores do formulário e os insere através da procedure na tabela tbUsuarios.

        ///

        ///

        ///

        ///

        ///

        ///

        public int inserirUsuario(string _nome, long _mail, string _user, string _senha)

        {

            clsDados objetoDados = new clsDados();

            SqlCommand cmdAjuda = new SqlCommand("____Inserir_Usuario", objetoDados.abreConexao());

            cmdAjuda.CommandType = CommandType.StoredProcedure;

            cmdAjuda.Parameters.AddWithValue("@NomeUsuario", _mail);

            cmdAjuda.Parameters.AddWithValue("@EmailUsuario", _nome);

            cmdAjuda.Parameters.AddWithValue("@UsuarioUsuario", _user);

            cmdAjuda.Parameters.AddWithValue("@SenhaUsuario", _senha);

            try

            {

                int nLinhas;

                nLinhas = cmdAjuda.ExecuteNonQuery();

                return nLinhas;

            }

            catch (SqlException ex)

            {

                throw new Exception("Erro encontrado: " + ex.Message);

            }

            finally

            {

                objetoDados.fechaConexao();

            }

        }

    }

}

Listagem 4: Código fonte da classe clsUsuario

Os aspectos importantes na Listagem 4 são os seguintes:

SqlCommand cmdAjuda = new SqlCommand("____Inserir_Usuario", objetoDados.abreConexao());

cmdAjuda.CommandType = CommandType.StoredProcedure;

Nas linhas acima um objeto do tipo SqlCommand é criado e, é passado ao construtor deste objeto o nome da SP (____Inserir_Usuario) e o método que abre a conexão com o banco (objetoDados.abreConexao()); Na linha inferior, apenas dizemos ao objeto que ele deverá executar um procedimento do tipo StoredProcedure.

cmdAjuda.Parameters.AddWithValue("@NomeUsuario", _mail);

cmdAjuda.Parameters.AddWithValue("@EmailUsuario", _nome);

cmdAjuda.Parameters.AddWithValue("@UsuarioUsuario", _user);

cmdAjuda.Parameters.AddWithValue("@SenhaUsuario", _senha);

Nas linhas acima associamoscada valor que está vindo como parâmetro para o método inserirUsuario com o parâmetro que a SP está esperando. Vale a pena frisar que os valores passados para os parâmetros da SP devem ser do mesmo tipo, caso contrário a procedure não conseguirá inserir os dados.

Finalmente, no bloco do try temos a execução através do método executeNonQuery() do objeto cmdAjuda e, por extensão, da procedure. A informação importante aqui é que o método executeNonQuery() retornará o número de linhas afetadas pela procedure, assim, atribuímos o retorno da execução da procedure à variável inteira nLinhas para que possamos verificar posteriormente o sucesso ou falha da execução da procedure.

Ok, para finalizar temos que testar nosso aplicativo de cadastro certo? Muito bem, vamos então até a camada de visualização/apresentação e criarmos nossa interface. O modelo sugerido por mim é aquele apresentado na Figura 6:

se6.jpg
Figura 6: Tela de cadastro de usuários

Vamos então testar a funcionalidade de nosso aplicativo de cadastro cadastrando um novo usuário :-). A Figura 7 apresenta o cadastro sendo realizado e a Figura 8 apresenta o resultado do cadastro. Finalmente, a Figura 9 apresenta o banco de dados populado pelas informações do formulário.

se7.jpg
Figura 7: Campos preenchidos com as informações solicitadas

se08.jpg
Figura 8: Apresentação do status do cadastro realizado

se9.jpg
Figura 9: Registro presente na tabela tbUsuarios

Fabrício Lopes Sanchez

Fabrício Lopes Sanchez - Possui graduação em Ciência da Computação pela UNORP - Centro Universitário do Norte Paulista (2005). Obteve título de mestre junto a USP (Universidade de São Paulo) no Programa Interunidades Bioengenharia campus São Carlos. Atualmente é aluno de doutorado e pesquisador na mesma instituição e departamento. É membro regular do SpeechLab (Laboratório de Processamento de Áudio e Voz) localizado no Instituto de Física de São Carlos. Atua na área de processamento digital de áudio e voz, especialmente baseado em wavelets aplicadas à inserção e extração de watermarks em sinais de áudio e fala, análise cepstral de sinais de fala e desenvolvimento de ferramentas computacionais aplicadas ao processamento digital de sinais. Atua como desenvolvedor web na União Central Brasileira da IASD com C# e ASP.NET desde 2007. É fundador e administrador da comunidade .NET Interior.