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 SanchezProcedures 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:
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:
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:
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.
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:
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:
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.
Figura 7: Campos preenchidos com as informações solicitadas
Figura 8: Apresentação do status do cadastro realizado
Figura 9: Registro presente na tabela tbUsuarios