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