Estou tentando fazer uma consulta no banco de dados para uma tela de login, porem sempre que clico no botão de login aparece o seguinte erro java.sql.SQLException: Parameter index out of range (4> number of parameters, which is 2)

    public void logar(){
        String sql="select * from usuarios where nome = ? and senha = ? ";
        try {
            pst = conexao.prepareStatement(sql);
            pst.setString(2, txtUsuario.getText());
            pst.setString(4, txtSenha.getText());
            
            rs = pst.executeQuery();

                if(rs.next()){
                principal principal = new principal();
                principal.setVisible(true);
              
                this.dispose();
                conexao.close();
            
            }else{
                JOptionPane.showMessageDialog(null, "Usuario ou Senha invalido");
        }
                
        } catch(Exception e){ e.printStackTrace();
            JOptionPane.showMessageDialog(null, e);
        }
    }
pst.setString(1, txtUsuario.getText());
pst.setString(2, txtSenha.getText());
1 curtida

mais o 2 e 4 não seria a coluna da tabela em que eu estou tentando pegar os dados

Mas…

Não. não estás a pegar dados nenhuns, estás a escrever no prepared statement. 1 e 2 são a ordem das interrogações na String "select * from usuarios where nome = ? and senha = ? "

2 curtidas

Você não está consumindo dados e sim passando parâmetros para uma consulta que precisa de 2 parâmetros, que são no caso o índice 1 e 2.

O código em questão faz com que o SQL gerado no final para consulta em banco tenha a substituação dos ? pelos valores que são passados.

Quando você aponta o índice de valor 4 ele acusa o erro pois o seu SQL só tem 2 posições de índice, como o 4 está fora do range ele lança uma exceção.