Pesquisei no google e no forum, a respeito de, como saber se o ResultSet, está vazio ou contém dados. Dentre as poucas, possibilidades, a mais sensata ao meu ver, foi através do retorno do metodo, first().
Ou seja, mando o cursor para o primeiro valor, se for encontrado, o retorno é “true” e o resultSet, contém dados. (vice-versa)
Há um metodo, especifico para isso ou uma melhor forma de, realizar essa verificação?
A ideia é verificar, se há no ResultSet, qualquer valor, no caso se houver apenas um, já é o suficiente. Pois, no caso, é para saber se, a tabela consultada, continha registro(s).
Gostaria de executar essa ação, realizando o minimo de interações, com o ResultSet. No caso, do next(), vi que sua função é alterar a posição do cursor. Caso o use e haja outros valores, vou mover o cursor, para proxima posição. O seria, uma ação, desnecessária.
Obrigado.
[]s
acromo
Não testei mais talvez funcione:
if(!seuResultSet.next()){
//resultSetvazio
}
Seria uma forma, mais este resultSet é de uma consulta SQL, se for acho que o correto poderia ser você usar um count para contar os registros da tabela e verificar se é maior que 0.
ViniGodoy
Ainda assim é melhor usar o next(). O first() exige um resultset scrollable, que geralmente consome consideravelmente mais recursos que o BD.
KaosBr
Bom dia,
No caso do, next(), como condição:
if(rs.next()){
...
}
O cursor, deverá, ser retornado ao, começar a excução de outros, procedimentos. Ou por estar sendo usado como condição, ele não desloca, o cursor da posição em que estava?
[]s
ViniGodoy
Sim, desloca. =/
O que exatamente você quer fazer?
KaosBr
A idéia, é depois, de fazer essa verificação, evitando um procedimento desnecessário.
Após essa verificaçção, os valores, da pesquisa, serão passados, a uma coleção para que sejam, manipulados pelo sistema.
Nota: Editei, para justificar, a necessidade da verificação.
Perdoe o transtorno.
ViniGodoy
Ainda não entendi. Vamos supor, você tem a coleção cliente, e faz o seguinte código (retirei trys, catchs e closes para deixar só a parte relevante):
publicList<Cliente>carregarClientesPorId(intid){PreparedStatementstmt=criarConexao().prepareStatement("SELECT * FROM tblClientes WHERE idCliente=?");stmt.setInt(1,id);ResultSetrs=stmt.executeQuery();List<Cliente>clientes=newArrayList<Cliente>();while(rs.next()){clientes.add(criarCliente(rs));}returnclientes;}
Onde você está fazendo operações desnecessárias? Se a tabela for vazia, você retorna uma lista de clientes vazia, que é o comportamento esperado.
Ainda não entendi que problema você quer resolver.
KaosBr
Acho que entendi
Estava achando que ao usar, como na linha 07, rs.next(). Poderia pular imediatamente uma linha e, na hora de inciar esse procedimento de povoar a coleção, iria faltar um valor. Mas pelo que entendi, isso não ocorre.
A outra questão, era evitar que uma, tabela vazia gera-se uma saida inesperada, que provoca-se outros erros. Porém como entendi, isso não vai ocorrer pois, o processo de inserção de objetos a coleção, nem vai acontecer.
É isso mesmo?
[]s
ViniGodoy
Sim, um resultSet inicia antes do primeiro registro. Tanto que se vc tentar ler dados antes do primeiro next() não funciona.