Desenvolvimento - ASP. NET

Como fazer uma enquete - parte 2 (final)

O objetivo do artigo é mostrar como é fácil fazer passo a passo um sistema de enquete.

por Mauricio Junior



Tecnologias usadas:

Banco de dados SQL Server 2005

Linguagem de programação: C#.NET

Tecnologia: ASP.NET

Instrução: Stored Procedure

Ferramenta: Visual Studio.NET 2008 SP-1

Componente: user control .ascx

Objetivo:

            O meu objetivo é mostrar a todos vocês leitores, como é fácil fazer passo a passo um sistema de enquete. As perguntas são buscadas no banco de dados utilizando Stored Procedure junto com as respostas. Foi usado o objeto include do arquivo .ascx (user control) do .NET.

Para nível de conhecimento, enquete é uma forma de pesquisa feita de maneira mais direta aos clientes, ou seja, possui respostas e perguntas objetivas, uma maneira de pesquisa feita por site ou sistema que deseja saber informações de seus clientes / pessoas que acessam ao site.

Figuras e Solução:

            Todas as figuras neste texto são reais, buscadas da própria solução. Todo o software mostrado nestes passos foi feito, comprovado e testado.

Artigo Anterior

            No artigo anterior, mostrei as tabelas no banco de dados, stored procedures de busca, insert e update. Qualquer dúvida só acessar a parte anterior. Esse texto é continuação efetiva do anterior, recomendo que leia o anterior.

            A ferramenta utilizada no primeiro texto foi o banco de dados SQL Server 2005 e Manager; agora a ferramenta será de desenvolvimento chamada Visual Studio.NET 2008 com 3.5 service pack 1 instalado.

Referência 2.1

Desenvolvimento Efetivamente

            Com o projeto criado de software cliquei com o botão direito em cima do nome, escolhi a opção ADD e em seguida New Item... Referência 2.2.

            Lembro que, neste primeiro caso estou definindo apenas o layout do sistema, adicionando arquivo com seus respectivos componentes; isto é; nenhum código efetivo será escrito ainda.

Referência 2.2.

           

            Automaticamente será apresentada uma tela mostrando os tipos de arquivos, escolhi a opção user control. (Referência 2.3)

Referência 2.4

            Note que, coloquei o nome do arquivo de “enquete.ascx”. Esse arquivo ficará dentro de um diretório padrão que defini chamado “include”. O mesmo será incluído dentro de um arquivo .aspx ou .master. No passo posterior mostrarei como incluir e como usar esse user control.

Código do Layout

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="enquete.ascx.cs" Inherits="aspneti.com.br.includes.enquete" %>

<!-- atributo que deixa com borda em volta -->

<fieldset>

<h3>Enquete - Dê sua opinião</h3>

<!-- componentes label e radiobutton -->

&nbsp;<asp:Label ID="lblPergunta" runat="server"></asp:Label><br />

<asp:HiddenField id="txtid" runat="server" />

<asp:RadioButtonList ID="rdResposta" runat="server" ValidationGroup="enquete">

</asp:RadioButtonList>

<!-- botao -->

&nbsp;<asp:Button ID="cmdVotar" runat="server" Text="Votar"

    onclick="cmdVotar_Click" ValidationGroup="enquete" />

    <br />

</fieldset>   

<!-- itens de validacao -->

<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"

    ControlToValidate="rdResposta" Display="Dynamic"

    ErrorMessage="Escolha uma opção." ValidationGroup="enquete"></asp:RequiredFieldValidator>

    <br />

<br />

<asp:ValidationSummary ID="ValidationSummary1" runat="server"

    ShowMessageBox="True" ShowSummary="False" ValidationGroup="enquete" />

Table 2.1

Explicação do código (table 2.1)

            O código do user control é bem simples e fácil, existem poucos objetos de tela e são bem definidos. Existe:

- Label (para exibir a pergunta buscada do banco de dados)

- HiddenField (contém o código escondido da pergunta)

- RadioButtonList (a lista de radio’s preenchidos diretamente do banco de dados)

- Fieldset (propriedade html para ficar com uma borda em volta)

- Objetos de validação dos dados

- Button (botão responsável para salvar a votação do usuário)

            Para revisar, preciso preencher alguns objetos de tela com os resultados vindos do banco de dados, os objetos são: label, hiddefield, radiobuttonlist.

            No arquivo .cs (enquete.aspx.cs), chamo métodos para o preenchimento, esses métodos chamam outros métodos de outras classes responsáveis para acesso ao banco de dados e suas stored procedures.

Código Fonte C# - Camada de Acesso

            Agora em diante, passarei para a camada de acesso a dados da enquete, antes mesmo de mostrar os dados do arquivo enquete.aspx.cs. O arquivo .cs chamará essa camada de acesso a dados.

           

Referência 2.5

            Primeiramente criei uma classe chamada EnqueteTO com dois atributos do tipo string. Opcao é o atributo que vem a resposta que o usuário clicou. Ip é o número do ip do usuário que está votando.

            O próximo passo foi criar uma outra classe responsável pelo acesso ao banco de dados, ou seja, a camada de acesso a dados. Onde acesso a stored procedure para inserir e atualizar o banco de dados. (Referência 2.6)

Referência 2.6

            O primeiro método que fiz foi o buscarEnquete(), o recebe nenhum parâmetro e pesquisa a stored procedure criada anteriormente, ou seja, na parte 1 desse texto indicada acima. O dado retornado é um objeto chamado DataSet, ou seja, vem alguns dados do método. (Referência 2.6)

            O próximo método criado é o votarEnquete(EnqueteTO to) que chama uma stored procedure passando parâmetro, a classe TO criada anteriormente, com dois parâmetros. Porém, para essa procedure, preciso passar apenas o atributo OPCAO_RES com seu respectivo valor. (Referência 2.7)

Referência 2.7

            Outro método feito foi o inserirIP(EnqueteTO to) que serve para inserir o IP da pessoa que está votando no banco de dados. O parâmetro de entrada foi a classe com seus atributos, porém o que é utilizado é o IP pego pela aplicação automaticamente na camada de apresentação. (Referência 2.8)

Referência 2.8

           

            Outro método foi preciso criar, para fazer a verificação antes do usuário votar, lembre-se que antes de votar é necessário verificar se aquele mesmo IP votou no mesmo dia, dessa forma, foi feito um método que faz essa verificação no banco de dados. (Referência 2.9)

Referência 2.9

            Note que todos os métodos que passo parâmetro utilizando o IDataParameter criando um new SqlParameter(). Essa é uma maneira muito certa para enviar parâmetros sem sofrer com problema de script ou invasão com inject sql.

            Esse método (referência 2.9) retorna um dado, esse dado é do tipo Int32 pois é um count que faço dentro da stored procedure.

Código C#.NET na Camada de Apresentação

           

            Na camada de apresentação existem 3 métodos, um private e dois protected. O primeiro é acessado quando a página entra ou inicia; depois ele chama o segundo para verificação. O terceiro método é chamado quando o usuário clica no botão votar. Serão apresentados cada um dos métodos.

Referência 2.10

            O método carregado no início da página (Page_Load) chama um segundo método chamado preencherDados(). (Referência 2.10)

            O método que preenche os dados chamado de (preencherDados()) busca a enquete, depois verifica se chegou algum dado com o Count, se houver algum dado, é atribuído ao componente de tela a pergunta com o comando lblPergunta.Text = dtSet.Table[0].Rows[0][“NO_PER”].ToString().

            O próximo passo foi fazer um for e atribuindo as opções vindas do banco de dados, isto é, as respostas para aquela pergunta adicionadas ao componente rdResposta. (Referência 2.11)

Referência 2.11

            O último método chamado (cmdVoltar_Click) significa que, ao clicar no botão VOTAR da enquete / pesquisa, chamará o método fazendo os seguintes passos:

1- Atribui a escolha do usuário e seu ip junto à classe EnqueteTO

2- Chama o método que verifica o IP do usuário passando o parâmetro (to)

3- Caso o número for igual a ZERO (O), entáo chamo o método votarEnquete(to)

4- Depois de votar, chamo o método inserirIP(to) que insere o ip do usuário no banco de dados, possibilitando assim a não votação no mesmo dia

5- Mostro a mensagem

6- Caso o usuário tentar votar novamente, aparece a segunda mensagem

(Referência 2.12)

protected void cmdVotar_Click(object sender, EventArgs e)

        {

            if (Page.IsValid)

            {

                aspneti.com.br.code.EnqueteTO to = new aspneti.com.br.code.EnqueteTO();

                to.Opcao = rdResposta.SelectedItem.Text;

                to.Ip = Request.UserHostAddress.ToString();

                aspneti.com.br.code.Enquete enq = new aspneti.com.br.code.Enquete();

                //verificar se o ip já foi inserido

                int numero = enq.verificarIP(to);

                StringBuilder str = new StringBuilder();

                if (numero == 0)

                {

                    if (enq.votarEnquete(to))

                    {

                        //inserir ip no banco de dados

                        enq.inserirIP(to);

                        str.Append("<script>alert("Obrigado pelo seu voto!");</script>");

                        Page.RegisterStartupScript("alert", str.ToString());

                    }

                }

                else

                {

                    str.Append("<script>alert("Prezado usuário, você já votou hoje, tente em outro dia");</script>");

                    Page.RegisterStartupScript("alert", str.ToString());

                }

            }

        }

Referência 2.12

            Bom aqui eu chego no final de mais um artigo. Espero ter ajudado e ensinado você leitor a desenvolver uma enquete / pesquisa para seu site. Qualquer dúvida, pode entrar em contato.

Mauricio Junior

Mauricio Junior - Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e cursando Mestrado na UNB Engenharia Elétrica; . Tenho 29 anos e possuo sete livros publicados pela editora Ciência Moderna e sou editor do Linha de Código.
Sou Certificado Microsoft MCP, MCAD e MVP, faço parte da comunidade ASPNETI.COM, onde publico artigos, vídeos, ebooks e livros Publico artigos, vídeos e podcast em outras comunidades. Trabalho como Analista de Sistemas / Desenvolvedor na empresa ATP S/A.
Blog:
blog.mauriciojunior.org
Site pessoal: www.mauriciojunior.org