Problema com ResultSet

13 respostas
R

Boa tarde a todos. Já procurei sobre o assunto no fórum porém não encontrei algo que possa resolver meu problema.

Estou desenvolvendo um programa com fins acadêmicos e estou utilizando o NetBeans e o SGBD postgresql.

Porém o mesmo está dando um erro estranho que não consegui resolver.

O trecho do meu código é:

String query = "SELECT *"
                        + "FROM  hotel.funcionario "
                        + "WHERE usuario = '"+login+"' and "
                        + "senha = '"+senha+"' ; ";
                
                Statement statement = cone.createStatement();
                
                rs = statement.executeQuery(query);
                rs.next();
                
                F.setCpf(rs.getString("cpf"));
                rs.close();

e o erro é o seguinte:

[color=red]org.postgresql.util.PSQLException: ResultSet não está posicionado corretamente, talvez você precise chamar next.
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkResultSet(AbstractJdbc2ResultSet.java:2695)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:1872)
[/color]

Não sei qual é o problema, visto que estou usando o next e até tentei usar os métodos first e tudo mais(Criando um resulset navegável).

Desde já agradeço.

13 Respostas

I

Fala renanmpn,

tenta assim:

rs = statement.executeQuery(query); 
List<Pessoa> lista = new ArrayList<Pessoa>() 
while(rs.next()){
    Pessoa f = new Pessoa f();
    f.setCpf(rs.getString("cpf"));
    lista.add(f); 
}
R

Igor, muito obrigado pela ajuda, porém não deu certo. Ele nem está entrando no laço do while.

R

tem resultado no banco? para esta query?

I

Já testou a query no SGBD pra ver se não tem algum erro na sintaxe?

E

Boa tarde.

O comando next() retorna um booleano indicando se o seu ResultSet chegou ao final.

ResultSet rs = statement.executeQuery();

Então você insere dentro um while seu objeto e o armazena em uma lista.

while(rs.next()){
                Objeto objeto = new Objeto();
                
                objeto.setAlgumCampo(rs.getString("cpf");
                list.add(objeto);
            }
            
            return list;

Acredito que com isso seu problema estará resolvido.

Uma outra dica é que se for fazer na mão os sql’s sem o uso de um ORM use ao menos o método PreparedStatement.

No Fórum tem muita coisa sobre isso.

Abraço e boa sorte.

R

Só explicar mais ou menos o que eu estou fazendo.

Isso serve somente para gerenciar um login, ou seja, o resultset terá somente uma tupla, por isso que não criei uma lista.
Os comandos sql, como este é simples, testei no próprio pgadim.
No caso no meu ele nem mesmo tá entrando no while, já sai logo de cara.

Grato pela ajuda

F

veja bem

//retorna uma lista de usuarios
public List<Usuarios> getUsuario(){
     List<Usuarios> lista = new ArrayList<Usuarios>();
     PreparedStatement stm = conexao.prepareStatement("SELECT * FROM usuarios");
     ResultSet rs = stm.executeQuery();
     while(rs.next()){
          Usuarios u = new Usuarios();
          u.setLogin(rs.getString("login"));
         
          lista.add(u);
     }
     rs.close();
     stm.close();
     return lista;
}


//verifica se o usuario possui login
public Boolean loginUsuario(String usuario, String senha){
       Boolean existe = false; //usuario naum existe
       PreparedStatement stm = conexao.prepareStatement("SELECT * FROM usuarios WHERE login = ? AND senha = ?");
       stm.setString(1, usuario);
       stm.setString(2, senha);
       ResultSet rs = stm.executeQuery();
       if(rs.next()){
            existe = true; //usuario existe
       }
       rs.close();
       stm.close();
       return existe;
}

Simples d++ …Estude sobre Pattern DAO, na apostila FJ21 da Caelum tem exemplos.

t+ e boa sorte.

L

Só corrigindo:

O resultSet quando retornado pela execução da query terá sempre seu cursor posicionado antes do primeiro registro, por isso é necessário utilizar o metodo next() que retorno um booleano que indica se existem um proximo registro e se este existir posiciona o cursor do resultSet neste proximo registro.

Ao que parece sua query não esta retornando nenhum registro.

R

Só para vocês entenderem que a query estava certa.

Olha o que retorna a busca direto pelo SGBD, ai no caso lá no meu .java o login e a senha são substituidos por este adm e 123, (Já mandei imprimir eles pra ver se estão corretos)


E
String query = "SELECT *"  
                        + "FROM  hotel.funcionario "  
                        + "WHERE usuario = '"+login+"' and "  
                        + "senha = '"+senha+"' ; ";

Isso se chama “SQL Injection” - nunca faça isso. Se o cara entrar como senha algo como :

'' AND 1 = 1; DROP TABLE hotel;

O que ele será capaz de fazer?
Hein?

Use um PreparedStatement (e obviamente não faça a concatenação dos valores “login” e “senha”. Use os “?” corretamente.

R

Beleza. Valeu pela dica, valeu mesmo. Porém isso arruma o problema? (Não entenda como ironia, por favor. É que estou inconformado com o erro)

E

O seu banco compara 2 strings levando em conta a diferença entre minúsculas e maiúsculas ou não?
É que vi que pode ser que o usuário cadastrado foi “Marcelo” mas a pessoa digitou “marcelo”. Então a query irá retornar 0 registros :frowning:

R

Não faz diferença não. porém eu digito igual a que está no banco.

Criado 22 de novembro de 2011
Ultima resposta 22 de nov. de 2011
Respostas 13
Participantes 7