Problemas com ResultSet

Olá a todos, desculpem se o assunto já foi postado anteriormente, mas eu não pude encontrar.

 O situação é a seguinte:
 Estou fazendo uma consulta simples em um banco de dados e o resultado estou jogando em um result set e eu preciso pegar o numero de resultados que foram retornados pela query para saber quantas vezes meu loop vai ter que rodar para preencher corretamente o vetor 'temp', para isso eu criei uma função getRowsNumber. 

Código do programa:

PreparedStatement stmt = con.prepareStatement(sql);
ResultSet rs;

rs = stmt.executeQuery();

int rows = getRowsNumber(rs);

while (rs.next()){
String[] temp = new String[3];

for(int j=1; j <= rows ;j++){
temp[j-1] = rs.getString(j);
}


Função getRowsNumber:

public static int getRowsNumber(ResultSet rs) throws SQLException{
int rows = 0;
while(rs.next()){
rows++;
}
return rows;
}

O [b]problema[/b] é que quando eu uso a função getRowsNumber ele perde o resultset e a perda a busca que foi feita.
Eu já tentei criar um outro result set igual ao 'rs' da função e disparar o getRowNumber por ela, da o mesmo erro.

Só que se eu ao invés de atribuir a função getRowsNumber a variável rows eu atribuir um inteiro com o tamanho do resultado ele funciona perfeitamente (nesse caso eu sei quantos registros irão retornar nesta busca).

Já procurei outras soluções já consultei colegas e já dei um STFW e não tive muito sucesso, gostaria que alguém que saiba ou já tenha passado por isso me diga onde eu estou errando, talvés eu esteja fazendo algo 'sem noção' devido a pouca experiencia em java pois estou começando a programar em java agora.

Agradeço a atenção de todos.
Caso eu não tenha sido claro na xplicação do meu problema avisem por favor, não gostaria que vocês ficassem perdendo tempo tentando entender algo que eu não expliquei direito, se for o caso eu elaboro uma explicação mais detalhada do problema.

Olá

Para “resetar” seu ResultSet vc pode usar o método beforeFirst()

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSet.html#beforeFirst()

Mas eu acho isso extremamente desnecessário. Ao invés de usar um vetor simples (que tem seu tamanho fixo) você pode usar um ArrayList, no qual vc pode ir adicionando um novo elemento a cada iteração do seu loop. Desse jeito vc varre o ResultSet apenas uma vez, não precisa fazer duas vezes, pois é desperdicio de tempo, processamento, etc…

ResultSet resultados = seuStatement.executeQuery();
ArrayList<Classe> objetos = new ArrayList<Classe>();
while(resultados.next()){
   seuObjeto = new Objeto();
   //inicializa seu objeto com os valores da linha atual do resultset
   objetos.add(seuObjeto);

}

//...

return objetos;

Sacou?

Até!

Primeiro, uma sujestão, ao invés de utilizar array prefira as implementações de List, que aumentam dinamicamente.

Segundo, a sua implementação está com o um problema de lógica, para percorrer um result set basta fazer o seguinte

List<Sting> resultado = new ArrayList<Stirng>();
while(rs.next()){
    resultado.add( rs.getString(1) ) //note que o rs.getString(int) retonra o número da coluna
}

Espero ter ajudado.

Perfeito! :smiley:
Entendi o que estava acontecendo agora, como eu tinha rodado o result set uma vez já na função getRowsNumber ele estava apontando para o final da lista então usando a função beforeFirst() ele retorna ao começo.

Mas como você tinha me dito realmente é melhor eu usar um ArrayList.

Muito Obrigado pelo pronto atendimento, foi de grande ajuda.

Agradecido.

Ok, irei implementar as duas maneiras, usando List e ArrayList e testarei para ver qual fica melhor.

De qualquer maneira usando List ou ArrayList vocês já resolveram meu problema, agradeço a atenção, e mais uma vez muito obrigado.