Login com Perfil de Acesso

07/10/2013

0

Olá, montei este código para o form de login, mas não entra e dá mensagem do Else...seja qual for dos usuários que tente entrar.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace SistemaBibliotecario
{
    public partial class FrmLogin : Form
    {
        //responsavel pelo nivel de acesso
        public static string NivelAcesso;
        //responsavel por mostrar quem está conectado
        public static string usuarioConectado;
        //responsavel por mostrar a senha para o alerta.
        public static string senhaUsuario;

        public static string conexao;

        public FrmLogin()
        {
            InitializeComponent();
        }
	  private void FrmLogin_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'bDBiblioteca2DataSet.Perfil' table. You can move, or remove it, as needed.
            this.perfilTableAdapter.Fill(this.bDBiblioteca2DataSet.Perfil);
            // TODO: This line of code loads data into the 'bDBiblioteca2DataSet.Funcionario' table. You can move, or remove it, as needed.
            this.funcionarioTableAdapter.Fill(this.bDBiblioteca2DataSet.Funcionario);
        }
        }
        private void BtnEntrar_Click(object sender, EventArgs e)
        {
            try
            {
                if ((textBox1.Text != "") && (textBox2.Text != "") && (cbxPerfil.Text != ""))
                {
                    //string de conexao
OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca2.mdb");
              //Responsavel pelo Comando Sql. conexao foi criado no inicio da tela. "select” tem os detalhes para conexao, nome da tb e as colunas
     OleDbCommand comando = new OleDbCommand("Select * From Funcionario Where Nome = @Nome  and " + "Senha = @Senha and Perfil=@Perfil", conexao);

                    //Parametrizar os codigos
                    comando.Parameters.Add("@Nome ", OleDbType.VarChar).Value = textBox1.Text;
                    comando.Parameters.Add("@Senha", OleDbType.VarChar).Value = textBox2.Text;
                    comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = cbxPerfil.Text;

                    
//Abre a conexão e coloca reader para poder ler os dados
                    conexao.Open();
                    OleDbDataReader reader = null;
                    //lê as linhas de uma base de dados
                    reader = comando.ExecuteReader();
                    //Se tiver coisa pra lê faça:
                    if (reader.Read())
                    {
 
//Variavel usuarioConectado foi criada no inicio da tela e recebe campo usuariotextBox.Text
                        usuarioConectado = textBox1.Text;
 //Variavel nivelAcesso foi criado no inicio da tela e recebe o campo nivelAcessoComboBox.Text
                        NivelAcesso = cbxPerfil.Text;
//Variavel nivelAcesso foi criado no inicio da tela e recebe o campo Senha do Usuario.Text
                        senhaUsuario = textBox2.Text;
                        //Declara a variavel que recebe o formulario FrmPrinciapal
                        FrmPrincipal frmp = new FrmPrincipal();
                        frmp.Show();
                        this.Hide();
                    }
                    else
                    {
                        MessageBox.Show("Usuário ou Senha Inválido !", "Acesso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        textBox1.Clear();
                        textBox2.Clear();
                        textBox1.Focus();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Jair Souza

Jair Souza

Responder

Post mais votado

22/10/2013

Só agora observei que dentro do while você faz a seguinte atribuição de valor:
perfil = NivelAcesso;

Sendo que NivelAcesso nem aparece no trecho de código, então provavelmente você a declarou como pública e ela está vazia. Assim, mesmo após preencher a variável "perfil" com o conteúdo da coluna que vem do banco, você passa para essa variável um valor em branco. O correto seria fazer o contrário:
NivelAcesso = perfil ;

mas na prática nem precisa, pois você pode utilizar a própria variável "perfil" para passar o valor para a propriedade do FrmPrincipal:
frmp.NivelAcesso = perfil;

Joel Rodrigues

Joel Rodrigues
Responder

Mais Posts

21/10/2013

Jair Souza

Eu entendo que declarei "NivelAcesso" como string e que na tabela funcionario o "Perfil" é um numero, e que tenho no FrmPrincipal um if comparando "NivelAcesso != "Administrador"...estou fazendo comparações entre texto e número, troquei string por int ...já fiz todas as alterações que pude e nada, ...trancou na falta de conhecimento...
Responder

22/10/2013

Jair Souza

Você está certo, mas no FrmPrincipal que tem este if, não teria que deixar sempre enabled os botões, pois no caso "vazio" não é diferente de "Administrador" ?
No entanto não deixa enabled nunca, independente se for Usuário ou Administrador.

private void FrmPrincipal_Load(object sender, EventArgs e)
        {
            if (NivelAcesso != "Administrador")
            {
               BtnFuncionarios.Enabled = false;
               BtnFuncionarios.BackColor = Color.Red;
               MenuCadPerfil.Enabled = false;
               MenuCadPerfil.ForeColor = Color.Red;
            }
        }
Responder

22/10/2013

Joel Rodrigues

Se for diferente de Administrador, você está DESABILITANDO e não habilitando. Então, se não for Administrador, ficará desabilitado.
E como você definiu em tempo de design? Ou seja, no design está habilitado ou desabilitado?
Responder

22/10/2013

Jair Souza

Correto, pois somente o Administrador terá acesso a essas opções.

Inicia Habilitado.
Responder

22/10/2013

Joel Rodrigues

E o que está errado? Está ficando desabilitado sempre por que o NivelAcesso, como você mesmo já constatou, é um número e não uma palavra. Você teria de verificar pelo número.
Responder

22/10/2013

Jair Souza

Vamos por partes :

*Em tempo de design inicia com as todas opções Habilitadas.

*Para Administrador que tem IDPerfil = 1, deve permanecer tudo Habilitado.

*Para Usuário que tem IDPerfil = 2, deve Desabilitar as duas opções.

E assim está o código agora :

Form Login : **Note que mudei para PUBLIC STATIC INT.

public static int NivelAcesso { get; set; }

        public static string usuarioConectado { get; set; }

        public static string senhaUsuario;

        public static string conexao;

        public FrmLogin()
        {
            InitializeComponent();
        }
        private void FrmLogin_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'bDBiblioteca2DataSet.Perfil' table. You can move, or remove it, as needed.
            this.perfilTableAdapter.Fill(this.bDBiblioteca2DataSet.Perfil);
            // TODO: This line of code loads data into the 'bDBiblioteca2DataSet.Funcionario' table. You can move, or remove it, as needed.
            this.funcionarioTableAdapter.Fill(this.bDBiblioteca2DataSet.Funcionario);
        }
        private void BtnEntrar_Click(object sender, EventArgs e)
        {
            try
            {
                if ((textBox1.Text != "") && (textBox2.Text != ""))
                {
                    OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca2.mdb");

                    OleDbCommand comando = new OleDbCommand("Select * from Funcionario where Login = @LOgin and Senha = @Senha", conexao);

                    comando.Parameters.Add("@Login ", OleDbType.VarChar).Value = textBox1.Text;
                    comando.Parameters.Add("@Senha", OleDbType.VarChar).Value = textBox2.Text;

                    conexao.Open();

                    OleDbDataReader reader = null;

                    reader = comando.ExecuteReader(CommandBehavior.CloseConnection);
      
                if (reader.HasRows)

                    while(reader.Read())
                    {
                        NivelAcesso = Convert.ToInt32(reader["Perfil"].ToString());
                        
                        usuarioConectado = textBox1.Text;
                        senhaUsuario = textBox2.Text;

                        FrmPrincipal frmp = new FrmPrincipal();
                        frmp.NivelAcesso = NivelAcesso;
                        frmp.Show();
                        this.Hide();


Form Principal : **Note que mudei para PUBLIC STATIC INT

public int NivelAcesso; 

       
         public FrmPrincipal()
         {
             InitializeComponent();
         }
        private void FrmPrincipal_Load(object sender, EventArgs e)
        {
            if (NivelAcesso != 1)
            {
               BtnFuncionarios.Enabled = false;
               BtnFuncionarios.BackColor = Color.Red;
               MenuCadPerfil.Enabled = false;
               MenuCadPerfil.ForeColor = Color.Red;
            }


**Declarei "Nivel de acesso" como public string e depois como public int, pois me dei conta que agora se trata de numero e não texto, mas não muda nada, nunca desabilita as benditas opções...

***Independente do login as determinadas opções, Nunca ficam Desabilitadas.
Responder

23/10/2013

Joel Rodrigues

Não precisa nem deve ser STATIC, deixe apenas como public int no FrmPrincipal. Já no FrmLogin, na verdade nem precisa ser public, pois ela só é usada dentro daquele método.

No FrmPrincipal, depure o código para verificar qual valor está sendo recebido pela variável NivelAcesso (se não souber depurar, exiba em um MessageBox).
Responder

23/10/2013

Jair Souza

Alterei o código conforme sua orientação, mas não mudou nada continua deixando tudo liberado...
E fiz o messagebox, o NivelAcesso carrega o valor correto do IDPerfil que é 1 para Administrador e 2 para Usuário, veja na imagem.

[url]http://uploaddeimagens.com.br/imagens/valor_do_nivelacesso-png[/url]

E fiz um messagebox no FrmPrincipal, o NivelAcesso é sempre "0" ...
Responder

25/10/2013

Jair Souza

Finalmente funcionou com o evento Shown, isto é muito bom, mas para chegar ao ideal é necessário ter no if a condição comparativa com a palavra “Administrador” ao invés de do número 1, imaginei que acrescentando INNER JOIN ao select poderia puxar a Descrição do perfil para o valor do perfil, mas não funcionou, podes me ajudar em mais esta ?
Abaixo as tabelas em questão e o código atual :

Tabela Perfil
IDPerfil – Numeração Automática
Nome - Texto
Descricao - Texto

Tabela Funcionario
IDFuncionario
Nome
Login
Senha
Perfil ---Junção--- IDPerfil
Situacao

No FrmPrincipal :

private void FrmPrincipal_Shown(object sender, EventArgs e)
        {
            if (NivelAcesso != "Administrador")


No FrmLogin :

OleDbCommand comando = new OleDbCommand("SELECT F.Perfil, P.Descricao FROM Funcionario AS F "+" INNER JOIN Perfil AS P ON F.Perfil = P.IDPerfil Where F.Login = @Login And F.Senha = @Senha", conexao);

			comando.Parameters.Add("@Login ", OleDbType.VarChar).Value = textBox1.Text;
                    comando.Parameters.Add("@Senha", OleDbType.VarChar).Value = textBox2.Text;

                    conexao.Open();

                    OleDbDataReader reader = null;

                    reader = comando.ExecuteReader(CommandBehavior.CloseConnection);
      
                if (reader.HasRows)

                    while(reader.Read())
                    {
                        NivelAcesso = reader["P.Descricao"].ToString();
                        
                        usuarioConectado = textBox1.Text;
                        senhaUsuario = textBox2.Text;

                        FrmPrincipal frmp = new FrmPrincipal();
                        frmp.NivelAcesso = NivelAcesso;
                        frmp.Show();
                        this.Hide();
                    }
Responder

25/10/2013

Joel Rodrigues

Nunca diga só "não funcionou", tente detalhar o que está acontecendo, como uma mensagem de erro ou um resultado inesperado.

Na seguinte linha:
NivelAcesso = reader["P.Descricao"].ToString();
ponha apenas "Descricao" ao invés de "P.Descricao".
Responder

27/10/2013

Jair Souza

Desculpe a falta de informação, e muito obrigado, pois finalmente funcionou e ficou como eu queria.

*No FrmLogin :
private void BtnEntrar_Click(object sender, EventArgs e)
        {
            try
            {
                if ((textBox1.Text != "") && (textBox2.Text != ""))
                {
                    OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca2.mdb");

                    OleDbCommand comando = new OleDbCommand("SELECT F.Perfil, P.Descricao FROM Funcionario AS F " + " INNER JOIN Perfil AS P ON F.Perfil = P.IDPerfil Where F.Login = @Login And F.Senha = @Senha", conexao);

                    comando.Parameters.Add("@Login ", OleDbType.VarChar).Value = textBox1.Text;
                    comando.Parameters.Add("@Senha", OleDbType.VarChar).Value = textBox2.Text;

                    conexao.Open();

                    OleDbDataReader reader = null;

                    reader = comando.ExecuteReader(CommandBehavior.CloseConnection);
      
                if (reader.HasRows)

                    while(reader.Read())
                    {
                        NivelAcesso = (reader["Descricao"].ToString());
                        
                        usuarioConectado = textBox1.Text;
                        senhaUsuario = textBox2.Text;

                        FrmPrincipal frmp = new FrmPrincipal();
                        frmp.NivelAcesso = Convert.ToString(NivelAcesso);
                        frmp.Show();
                        this.Hide();
                    }
                    else
                    {
                        MessageBox.Show("Usuário ou Senha Inválido !", "Acesso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        textBox1.Clear();
                        textBox2.Clear();
                        textBox1.Focus();
                    }
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


**No FrmPrincipal :
public string NivelAcesso;
        
        private void FrmPrincipal_Shown(object sender, EventArgs e)
        {
            if (NivelAcesso != "Administrador")
            {
                BtnFuncionarios.Enabled = false;
                MenuCadFuncionarios.Enabled = false;
                MenuCadPerfil.Enabled = false;
            }
        }
Responder

27/10/2013

Joel Rodrigues

Muito bom, fico feliz por ter contribuído de alguma forma.
Sempre que precisar, sinta-se à vontade para abrir novos tópicos.

Um abraço.

Estou conculindo o tópico.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar