Tela de login

E aê galera!

Estou com problemas com minha tela de login…
Sendo que somente a condição “else” é executada, independente do que digito nos campos, tendo o registro no bando ou não.
Segue o trecho do código:

[code] private void fazerLogin(java.awt.event.ActionEvent evt) {
try {
Class.forName(“com.mysql.jdbc.Driver”);
String url = “jdbc:mysql://localhost:3306/gerpro”;
String usuario = “root”;
String senha = “admin”;
Connection con;
con = DriverManager.getConnection(url, usuario, senha);
PreparedStatement ps = con.prepareStatement("SELECT login, senha, departamento FROM cadastro WHERE " +
"login = ? AND senha = ? AND departamento = ? ");

        ps.setString(1, cxTxtLogLogin.getText());   
        ps.setString(2, String.valueOf(cxTxtLogSenha.getPassword()));   
        ps.setString(3, String.valueOf(comboLogDepartamento.getSelectedItem()));   

        ResultSet rs = ps.executeQuery();
        
        if (rs.next()){
            login.dispose();
        }else{
            JOptionPane.showMessageDialog(null, "Login Incorreto.\n" +
                    "Tente novamente.\n","Mensagem do Programa", JOptionPane.ERROR_MESSAGE);
        }
        }catch (ClassNotFoundException e){
            JOptionPane.showMessageDialog(null, "Falha na conexão com o banco de dados.\n" + e.getMessage());
                e.printStackTrace();
        }catch (SQLException e){
                e.printStackTrace();
    }
}[/code]

Caso alquem possa me ajudar, fico etenamente grato.

Wesley Marra

O next so vai retornar true, caso exista algum valor na linha do ResultSet a ser chamada, então, se você diz que sempre ele vai para o else, seria bom ver (debug) o que está chegando nos metodos:

cxTxtLogLogin.getText();
String.valueOf(cxTxtLogSenha.getPassword());
String.valueOf(comboLogDepartamento.getSelectedItem()); 

e confirma se isso iria devolver alguma valor na consulta.

t+

olá sudeval!

Bom achei melhor mudar de PreparedStatement para Statement.
Agora eu dou um clique no botão e não acontece nada, como se não tivesse código algum.
o código agora está assim:

[code] private void fazerLogin(java.awt.event.ActionEvent evt) {
try {
Class.forName(“com.mysql.jdbc.Driver”);
String url = “jdbc:mysql://localhost:3306/gerpro”;
String usuario = “root”;
String senha = “admin”;
Connection con;
con = DriverManager.getConnection(url, usuario, senha);
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery(“SELECT login, senha, departamento FROM cadastro WHERE " +
“login =’”+cxTxtLogLogin.getText()+”’ AND senha =’"+cxTxtLogSenha.getPassword()+"’ AND " +
“departamento =’”+comboLogDepartamento.getSelectedItem()+"’");

        if (rs.next()){
                login.dispose();
            }
        }catch (ClassNotFoundException e){
                JOptionPane.showMessageDialog(null, "Falha na conexão com o banco de dados.\n" + e.getMessage());
                    e.printStackTrace();
        }catch (SQLException e){
                JOptionPane.showMessageDialog(null, "Login Incorreto.\n" + e.getMessage() +
                    "Tente novamente.\n","Mensagem do Programa", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
    }       
}  [/code]

caso tenha alguma ideia que possa me ajudar, desde já agradeço

Wesley Marra

a minha pista continua sendo no que está chegando naqueles metodos get, veja o que está sendo retornado ali, veja o que você tem no banco, ae você vai encontrar o “problema”. ( debuga, ou faz até com

System.out.println("Login:" +cxTxtLogLogin.getText()+"\tSenha: "+cxTxtLogSenha.getPassword()+"\tDepartamento: "+comboLogDepartamento.getSelectedItem());

obtendo essas informações você pode fazer a mesma consulta no seu banco e checar la o porque que não está sendo retornado !

Boa noite Sudeval,

Testei o que me falou…

[quote]a minha pista continua sendo no que está chegando naqueles metodos get, veja o que está sendo

System.out.println("Login:" +cxTxtLogLogin.getText()+"\tSenha: "+cxTxtLogSenha.getPassword()+"\tDepartamento: "+comboLogDepartamento.getSelectedItem());

obtendo essas informações você pode fazer a mesma consulta no seu banco e checar la o porque que não está sendo retornado ! [/quote]
Porém o resultado foi positivo.
Ou seja, o login retornou correto, a senha criptografada e o departamento correto.
Caso tenha outra ideia, por favor me ajude.

Desde já agradeço mesmo a força.

Abraços

Wesley Marra

no segundo post você retirou a parte do else ou foi impressão minha ? o que está acontecendo agora ? antes ele sempre caia no else é isso e agora ele não faz nada é por ae ?

nao sei se estou passando por cima de algo, mas poderia dizer que com relação ao código está OK, a minha pista era quando tu fosse fazer a tua consulta os parametros estivem com algo diferente do que está no banco. :frowning:

String sql = "SELECT login, senha, departamento FROM cadastro WHERE " +  
                  "login ='"+cxTxtLogLogin.getText()+"' AND senha ='"+cxTxtLogSenha.getPassword()+"' AND " +  
                  "departamento ='"+comboLogDepartamento.getSelectedItem()+"';
System.out.println(sql);
ResultSet rs = stm.executeQuery(sql);
...

quem sabe não é alguma onda dessas aspas, ae tu pega o sql que vai sair no teu terminal copia e cola no banco fazendo a consulta pra ver o que está errado!

espero ter ajudado !

E ae Sudeval,

O codigo sem comparar o JPasswordField funciona, mas quando eu o coloco não.
Ou seja, o problema está sendo na comparação do JPasswordField com os dados inseridos no banco de dados.
Talvez seja pela criptografia do campo JPasswordField quando inserido no banco de dados, ao qual, modifica os valores colocando carcteres a mais ou a menos.
Caso tenha alquma idéia sobre isso agradeço muito.
E me desculpe o incomodo, mas é que estou apanhando e muito nessa parte do código.
A parte do código sem o JPasswordField ao qual funciona é a seguinte:

[code] private void fazerLogin(java.awt.event.ActionEvent evt) {
try {
Class.forName(“com.mysql.jdbc.Driver”);
String url = “jdbc:mysql://localhost:3306/gerpro”;
String usuario = “root”;
String senha = “admin”;
Connection con;
con = DriverManager.getConnection(url, usuario, senha);
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery(“SELECT login, departamento FROM cadastro WHERE " +
“login =’”+cxTxtLogLogin.getText()+”’ AND " +
“departamento =’”+comboLogDepartamento.getSelectedItem()+"’");

        if (rs.next()){               
                login.dispose();
        }
        }catch (ClassNotFoundException e){
                JOptionPane.showMessageDialog(null, "Falha na conexão com o banco de dados.\n" + e.getMessage());
                    e.printStackTrace();
        }catch (SQLException e){
                JOptionPane.showMessageDialog(null, "Login Incorreto.\n" + e.getMessage() +
                    "Tente novamente.\n","Mensagem do Programa", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
    }       
}[/code]

Valeu mesmo a força

Wesley Marra

ahhhhhhhhh! meu caro Wesley Moura

o seu getPassword() é por um acaso de um JPasswordField ?
se sim, cara esse metodo retorna um array de char[] :slight_smile:

ou seja, você vai precisar fazer

String login = cxTxtLogLogin.getText();
String senha = new String(cxTxtLogSenha.getPassword());
String departamento = comboLogDepartamento.getSelectedItem(); // nao sei se é String, fiz imaginando isso, se nao for tu altera ae !

String sql = "SELECT login, senha, departamento FROM cadastro WHERE " +    
                  "login ='"+login+"' AND senha ='"+senha+"' AND " +    
                  "departamento ='"+departamento+"';  

ResultSet rs = stm.executeQuery(sql);
...

a

oi Sudeval,

Lembrando que fico muito agradecido a ajuda que está me fornecendo.

Quanto ao codigo, seria isso:

[code] private void fazerLogin(java.awt.event.ActionEvent evt) {
try {
Class.forName(“com.mysql.jdbc.Driver”);
String url = “jdbc:mysql://localhost:3306/gerpro”;
String usuario = “root”;
String senha = “admin”;
Connection con;
con = DriverManager.getConnection(url, usuario, senha);
Statement stm = con.createStatement();

        String log = cxTxtLogLogin.getText();   
        String sen = new String(cxTxtLogSenha.getPassword());   
        String dep = (String) comboLogDepartamento.getSelectedItem();    
        String sql = "SELECT login, senha, departamento FROM cadastro WHERE " +       
                    "login ='"+log+"' AND senha ='"+sen+"' AND " +       
                    "departamento ='"+dep+"'";     

        ResultSet rs = stm.executeQuery(sql);  
                   
        if (rs.next()){               
                login.dispose();
        }
        else {
            JOptionPane.showMessageDialog(null, "Login Incorreto.\nTente novamente."
                    ,"Mensagem do Programa", JOptionPane.ERROR_MESSAGE);
        }
        }catch (ClassNotFoundException e){
                JOptionPane.showMessageDialog(null, "Falha na conexão com o banco de dados.\n" + e.getMessage());
                    e.printStackTrace();
        }catch (SQLException e){
                JOptionPane.showMessageDialog(null, "Login Incorreto.\n" + e.getMessage() +
                    "Tente novamente.\n","Mensagem do Programa", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
    }       
} [/code]

Pois agora só cai no else novamente.

Caso tenha algo errado me dê um alô.

Novamente valeu

Cara até que em fim consegui!!!

Tive que altera como era inserido no banco de dados da seguinte forma:
Colocando a linha de codigo abaixo:

Me dando assim a possibilidade de compara-la na consulta. da maneira em que me falou:

[code] String log = cxTxtLogLogin.getText();
String sen = new String(cxTxtLogSenha.getPassword());
String dep = (String) comboLogDepartamento.getSelectedItem();
String sql = “SELECT login, senha, departamento FROM cadastro WHERE " +
“login =’”+log+”’ AND senha =’"+sen+"’ AND " +
“departamento =’”+dep+"’";

       ResultSet rs = stm.executeQuery(sql); [/code]

Valeu mesmo a força

Abraços

Wesley Marra

legal! :smiley:
agora tu ja pode voltar a usar o prepared… que é mais feliz e limpo :smiley:

t+

E de preferência usando uma classe separada para não misturar o acesso ao BD com a GUI! :smiley:

Valeu Galera,
Brigadão mesmo. :smiley:
Forte Abraço
Wesley Marra