ResultSet - Vazio [Resolvido]

11 respostas
KaosBr

Bom dia,

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?

[]s

11 Respostas

acromo

Caso você esteja querendo varrer o resultSet? se for isto você pode usar o seguinte codigo:

while (seuResultSet.next()){

     // Aqui você deve recuperar a informação que você esta buscando, podendo popular um arrayList e depois verificar se ele esta vazio

}
KaosBr

Bom dia,

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()) {
     // resultSet vazio
}

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):
public List<Cliente> carregarClientesPorId(int id) {
   PreparedStatement stmt = criarConexao().prepareStatement("SELECT * FROM tblClientes WHERE idCliente=?");
   stmt.setInt(1, id);
   ResultSet rs = stmt.executeQuery();
   List<Cliente> clientes = new ArrayList<Cliente>();

   while (rs.next()) {
      clientes.add(criarCliente(rs));
   }

   return clientes;
}

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 :slight_smile:

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.

KaosBr

Boa tarde,

Obrigado, pela ajuda que, me deram :slight_smile:

[]s

Criado 14 de outubro de 2010
Ultima resposta 15 de out. de 2010
Respostas 11
Participantes 3