ResultSet - Vazio [Resolvido]

11 respostas
K

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

A

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

}
K

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

A

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.

V

Ainda assim é melhor usar o next(). O first() exige um resultset scrollable, que geralmente consome consideravelmente mais recursos que o BD.

K

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

Sim, desloca. =/

O que exatamente você quer fazer?

K

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
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.

K

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

V

Sim, um resultSet inicia antes do primeiro registro. Tanto que se vc tentar ler dados antes do primeiro next() não funciona.

K

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