Olá amigos, possuo o seguinte código que faz uma simples busca do banco de dados:
quando faço a busca ela vem correta e tal trazendo os dados, porém ela só faz isso se eu não usar o next(), se eu usar da erro dizendo q nao possui mais registros, ou seja, o registro q busco está na posição 0 do resultset!
Alguém tem uma explicação pra isso?
porque até onde eu sei é sempre necessário usar o next para acessar o primeiro registro.
Agradeço a atenção.
publicbooleanverifyUserGrants(Stringuser,Stringpass,booleanisAdministrator){PreparedStatementstatement=null;ResultSetrs=null;try{statement=this.connection.prepareStatement("SELECT * FROM users WHERE userName = ? AND password = ?");statement.setString(1,user);statement.setString(2,pass);rs=statement.executeQuery();if(rs.next()){if(isAdministrator){Stringrole=rs.getString("role");if(role.equals("1")){returntrue;}else{returnfalse;}}returntrue;}}catch(SQLExceptione){System.out.println("Error: "+e.getMessage());e.printStackTrace();}finally{try{if(rs!=null)rs.close();if(statement!=null)statement.close();}catch(SQLExceptione){e.printStackTrace();}}
Devem existir registros duplicados, rode a query direto no seu banco de dados, para evitar esse problema vc não deve permitir o cadastro de usuários duplicados, vc consegue trazer somente 1 registro alterando a propria query por exemplo:
Postgres ou Mysql
selectcampofromtabelalimit1
SQL Server
selectcampofromtabelatop1
Cada banco de dados tem a sua sintaxe da limitação.
J
jonatanpedro
Retorna só um registro, é o único do banco.
P
Pedrosa
Qual a mensagem de erro que gera?
Troque o if(rs.next()) por um while(rs.next()) e veja se funciona.
J
jonatanpedro
Valeu a resposta pedrosa, não aparece mensagem de erro pq o next está no if e retorna false, mas seria um erro comum de nao possuir mais registros.
Com while é o mesmo problema, só não consigo entender o pq de acontecer isso no next().
A
Alberes
Coloca a printStackTrace, isto não deveria ocorrer, antes de usar os métodos rs é obrigatório usar o rs.next(), indiferente de usar if ou while que server para verificar se tem registro e não dar erro.
Inicialmente ele aponta para uma posição inválida, dai o uso do método rs.next() que atualiza a posição do cursor para uma posição válida e a sequência de registro.
J
jonatanpedro
Tirei o next de dentro do if para mostrar o stacktrace:
Você tem que usar o ResultSet .next(), se for um registro você usa o if se for vários usa o while
if(rs.next()){
Stringrole=rs.getString("role");
}
Pela mensagem de erro é como se você tivesse percorrido todos os registros e depois tentar acessar o método do ResultSet, mas como já percorreu todos os registros não dá mais para acessar os métodos para recuperar os valores do registro.
O campo role existe?
T
thingol
Sua consulta retorna 1 registro se o usuário e senha baterem, e 0 registros se alguma coisa não bater (usuário e/ou senha).
Quando entramos dentro do if (next), então você já sabe que o usuário e a senha batem, e existe o tal usuário no banco.
Se não entrar no if (next), então o usuário e/ou senha não bateram, então você tem de retornar false mesmo. Simples assim.
W
Weslley
[color=darkblue]existe um problema…
vc declarou return dentro da condição de verificação… se vc for usar tanto if quanto while, se for valida a condição, ele já dá return, então ele sai da expressão…
Não tenho certeza… mas acho q é isso…[/color]
J
jonatanpedro
Obrigado a todos pelas respostas, mas o problema era algum bug da virtual machine, ou algo do genero, aquele código não era meu, então resolvi apagá-lo e reescrever um e funcionou.