Login com Perfil de Acesso
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
Curtidas 0
Melhor post
Joel Rodrigues
22/10/2013
Só agora observei que dentro do while você faz a seguinte atribuição de valor:
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:
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:
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;
GOSTEI 1
Mais Respostas
Valter Furtado
07/10/2013
Experimenta retirar cbxPerfil.Text != ""
Que tipo de campo é esse?? Um checkbox? tem texto nele?
Que tipo de campo é esse?? Um checkbox? tem texto nele?
GOSTEI 0
Jair Souza
07/10/2013
Com esta alteração entrou, mas não faz a verificação do perfil, para que se possa desabilitar alguns menus, botões...dependendo do usuário.
GOSTEI 0
Jair Souza
07/10/2013
E aí pessoal...alguma dica ?
GOSTEI 0
Jair Souza
07/10/2013
Experimenta retirar cbxPerfil.Text != ""
Que tipo de campo é esse?? Um checkbox? tem texto nele?
Que tipo de campo é esse?? Um checkbox? tem texto nele?
Fiz algumas alterações, e o login está funcionando, identifica usuário, senha e se o perfil não estiver igual ao que foi cadastrado para este usuário não entra :
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
{
public static string 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);
PerfilcomboBox1.SelectedIndex = -1;
}
private void BtnEntrar_Click(object sender, EventArgs e)
{
try
{
if ((textBox1.Text != "") && (textBox2.Text != "") && (PerfilcomboBox1.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 And Perfil = @Perfil", conexao);
comando.Parameters.Add("@Login ", OleDbType.VarChar).Value = textBox1.Text;
comando.Parameters.Add("@Senha", OleDbType.VarChar).Value = textBox2.Text;
comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = PerfilcomboBox1.Text;
conexao.Open();
OleDbDataReader reader = null;
reader = comando.ExecuteReader();
if (reader.Read())
{
usuarioConectado = textBox1.Text;
senhaUsuario = textBox2.Text;
NivelAcesso = PerfilcomboBox1.Text;
FrmPrincipal frmp = new FrmPrincipal();
frmp.Show();
this.Visible = false;
}
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);
}
}
private void BtnCancelar_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void FrmLogin_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
{
this.ProcessTabKey(true);
e.Handled = true;
}
}
}
}
...até aí beleza, mas no form principal que coloquei o código abaixo, não faz a distinção de Nível de acesso, tipo ser for Usuário deixar enable alguns botões, independente de quem faça o login ele libera tudo...o que deve estar faltando ?
private void FrmPrincipal_Load(object sender, EventArgs e)
{
if (FrmLogin.NivelAcesso == "2")
{
toolStripButton5.Enabled = false;
perfilToolStripMenuItem.Enabled = false;
}
}
GOSTEI 0
Joel Rodrigues
07/10/2013
O ideal aí é você criar uma variável pública no FrmPrincipal e preencher ela antes de exibí-lo. Por exemplo:
No FrmPrincipal:
No FrmLogin, para exibir o form prnicipal:
No FrmPrincipal:
public string NivelAcesso;
No FrmLogin, para exibir o form prnicipal:
FrmPrincipal frmp = new FrmPrincipal(); frmp.NivelAcesso = NivelAcesso; //que foi preenchido com o valor do ComboBox frmp.Show();
GOSTEI 0
Jair Souza
07/10/2013
Baseando-se nesse código que já tenho, como eu poderia colocar o valor do perfil diretamente na variavel e assim eliminar este combobox, para que se digite somente login e senha, mas seja feito a verificação de perfil ?
GOSTEI 0
Joel Rodrigues
07/10/2013
Provavelmente o perfil está contido na tabela de usuários. Então, da mesma forma com que você recupera o login e senha, é só acessar o campo que contém o perfil e atribuir diretamente a uma variável.
GOSTEI 0
Jair Souza
07/10/2013
Eu tentei assim, mas não funcionou.
OleDbCommand comando = new OleDbCommand("Select * From Funcionario Where Login = @Login And " + "Senha = @Senha And Perfil = @Perfil", conexao);
comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = NivelAcesso;GOSTEI 0
Joel Rodrigues
07/10/2013
Aí você está filtrando pelo perfil e não lendo o valor dele. Você precisa ler o valor da coluna após fazer o select.
GOSTEI 0
Jair Souza
07/10/2013
Ajustei assim e ainda não, acho que fundiu os neurônios...
Dá erro no código nesta duas linhas :
comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = NivelAcesso;
NivelAcesso = Perfil;
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 And Perfil = @Perfil",
conexao);
comando.Parameters.Add("@Login ", OleDbType.VarChar).Value = textBox1.Text;
comando.Parameters.Add("@Senha", OleDbType.VarChar).Value = textBox2.Text;
comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = NivelAcesso;
conexao.Open();
OleDbDataReader reader = null;
reader = comando.ExecuteReader();
if (reader.Read())
{
usuarioConectado = textBox1.Text;
senhaUsuario = textBox2.Text;
NivelAcesso = Perfil;
}Dá erro no código nesta duas linhas :
comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = NivelAcesso;
NivelAcesso = Perfil;
GOSTEI 0
Joel Rodrigues
07/10/2013
Na verdade você continua fazendo a mesma coisa. Pesquise sobre como ler os valores de um DataReader, vai ser algo como:
após efetuar a consulta.
string perfil = reader["Perfil"].ToString()
GOSTEI 0
Jair Souza
07/10/2013
Bom dia, fiz as alterações, mas agora dá o seguinte erro quando tento autenticar o usuário "Nenhum valor foi fornecido para um ou mais parâmetros necessários." o código do form Login está assim :
E o do form Pricipal assim :
**Eu entendo que deve faltar Um parâmetro para "Perfil" como tem para usuário e senha, tipo assim "comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = " mas Igual a que, se para perfil não tem textbox ?;
***E mais uma dúvida, devo fazer tambem esta sua orientação :
"O ideal aí é você criar uma variável pública no FrmPrincipal e preencher ela antes de exibí-lo. Por exemplo:
No FrmPrincipal:
#Código
public string NivelAcesso;
No FrmLogin, para exibir o form prnicipal:
#Código
FrmPrincipal frmp = new FrmPrincipal();
frmp.NivelAcesso = NivelAcesso; //que foi preenchido com o valor do ComboBox
frmp.Show(); "
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
{
public static string 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 And Perfil = @Perfil", 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();
string perfil = reader["Perfil"].ToString();
perfil = NivelAcesso;
if (reader.Read())
{
usuarioConectado = textBox1.Text;
senhaUsuario = textBox2.Text;
FrmPrincipal frmp = new FrmPrincipal();
frmp.Show();
this.Visible = false;
}
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);
}
}
E o do form Pricipal assim :
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;
namespace SistemaBibliotecario
{
public partial class FrmPrincipal : Form
{
public FrmPrincipal()
{
InitializeComponent();
}
private void FrmPrincipal_Load(object sender, EventArgs e)
{
if (FrmLogin.NivelAcesso != "1") // Diferente de 1, pois é o ID do Administrador.
{
toolStripButton5.Enabled = false;
perfilToolStripMenuItem.Enabled = false;
}
}
**Eu entendo que deve faltar Um parâmetro para "Perfil" como tem para usuário e senha, tipo assim "comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = " mas Igual a que, se para perfil não tem textbox ?;
***E mais uma dúvida, devo fazer tambem esta sua orientação :
"O ideal aí é você criar uma variável pública no FrmPrincipal e preencher ela antes de exibí-lo. Por exemplo:
No FrmPrincipal:
#Código
public string NivelAcesso;
No FrmLogin, para exibir o form prnicipal:
#Código
FrmPrincipal frmp = new FrmPrincipal();
frmp.NivelAcesso = NivelAcesso; //que foi preenchido com o valor do ComboBox
frmp.Show(); "
GOSTEI 0
Joel Rodrigues
07/10/2013
Vamos às respostas:
Aqui cabe uma pergunta: você precisa filtrar pelo perfil? Eu creio que o filtro seja feito apenas pelo login (e senha, no caso) e o perfil seja apenas lido. Ou seja, quando o usuário faz o login, você identifica o perfil dele.
Exatamente, deve fazer da forma como eu orientei, pois você pode passar valores para o FrmPrincipal e a partir daí ficar independente do FrmLogin.
**Eu entendo que deve faltar Um parâmetro para "Perfil" como tem para usuário e senha, tipo assim "comando.Parameters.Add("@Perfil", OleDbType.VarChar).Value = " mas Igual a que, se para perfil não tem textbox ?;
Aqui cabe uma pergunta: você precisa filtrar pelo perfil? Eu creio que o filtro seja feito apenas pelo login (e senha, no caso) e o perfil seja apenas lido. Ou seja, quando o usuário faz o login, você identifica o perfil dele.
***E mais uma dúvida, devo fazer tambem esta sua orientação :
Exatamente, deve fazer da forma como eu orientei, pois você pode passar valores para o FrmPrincipal e a partir daí ficar independente do FrmLogin.
GOSTEI 0
Jair Souza
07/10/2013
Fiz estes ultimos ajustes, mas não deixa enabled as opções determinadas no form pirncipal , o que será que falta ?
E no formPrincipal
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 Perfil 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())
{
string perfil = reader["Perfil"].ToString();
perfil = NivelAcesso;
usuarioConectado = textBox1.Text;
senhaUsuario = textBox2.Text;
FrmPrincipal frmp = new FrmPrincipal();
frmp.NivelAcesso = 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);
}
}
} E no formPrincipal
private void FrmPrincipal_Load(object sender, EventArgs e)
{
if (NivelAcesso != "1")
{
BtnFuncionarios.Enabled = false;
MenuCadPerfil.Enabled = false;
}
}GOSTEI 0
Joel Rodrigues
07/10/2013
Verifique se o valor da propriedade NivelAcesso está sendo passado corretamente.
GOSTEI 0
Jair Souza
07/10/2013
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...
GOSTEI 0
Jair Souza
07/10/2013
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.
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;
}
}
GOSTEI 0
Joel Rodrigues
07/10/2013
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?
E como você definiu em tempo de design? Ou seja, no design está habilitado ou desabilitado?
GOSTEI 0
Jair Souza
07/10/2013
Correto, pois somente o Administrador terá acesso a essas opções.
Inicia Habilitado.
Inicia Habilitado.
GOSTEI 0
Joel Rodrigues
07/10/2013
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.
GOSTEI 0
Jair Souza
07/10/2013
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.
Form Principal : **Note que mudei para PUBLIC STATIC INT
**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.
*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.
GOSTEI 0
Joel Rodrigues
07/10/2013
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).
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).
GOSTEI 0
Jair Souza
07/10/2013
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" ...
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" ...
GOSTEI 0
Joel Rodrigues
07/10/2013
No FrmPrincipal, ponha a rotina de verificação do perfil no método Shown, ao invés de no método Load.
GOSTEI 0
Jair Souza
07/10/2013
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 :
No FrmLogin :
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();
}
GOSTEI 0
Joel Rodrigues
07/10/2013
Nunca diga só "não funcionou", tente detalhar o que está acontecendo, como uma mensagem de erro ou um resultado inesperado.
Na seguinte linha: ponha apenas "Descricao" ao invés de "P.Descricao".
Na seguinte linha:
NivelAcesso = reader["P.Descricao"].ToString();
GOSTEI 0
Jair Souza
07/10/2013
Desculpe a falta de informação, e muito obrigado, pois finalmente funcionou e ficou como eu queria.
*No FrmLogin :
**No FrmPrincipal :
*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;
}
}GOSTEI 0
Joel Rodrigues
07/10/2013
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.
Sempre que precisar, sinta-se à vontade para abrir novos tópicos.
Um abraço.
Estou conculindo o tópico.
GOSTEI 0