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
A
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.
V
ViniGodoy
Ainda assim é melhor usar o next(). O first() exige um resultset scrollable, que geralmente consome consideravelmente mais recursos que o BD.
K
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
V
ViniGodoy
Sim, desloca. =/
O que exatamente você quer fazer?
K
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.
V
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.
K
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
V
ViniGodoy
Sim, um resultSet inicia antes do primeiro registro. Tanto que se vc tentar ler dados antes do primeiro next() não funciona.