Ultimo valor do resultset

Olá a todos… estou desenvolvendo uma aplicação, que após fazer uma procura num banco, mostra os dados na tela.

Gostaria de acrescentar detalhes sobre isso, por exemplo:

Foram encontrados tantos resultados.
Mostrando resultado 1 de tantos.

Como faço para pegar esses tantos? Uma vez que não existe um getRows que pega todas e sim um getRow que pega a linha que está, como faço pra falar quantas ele achou? Tem como?

while( rs.next )
++totalOfRecords;

:smiley:

vc pode fazer um select count pro próprio banco de dados contar os valores pra vc…

As duas sugestoes funcionam, mas a sua pergunta demonstra um probleminha um pouco mais grave: voce esta usando ResultSets pra mostrar dados pro usuario, sem nenhum passo intermediario. Ou seja, vc esta mantendo o ResultSet aberto por um tempo desnecessario, o que gasta uma boa dose de recursos do banco… talvez fosse mais simples copiar tudo pra uma Collection e usar os metodos dela, tipo o size(), nao? :smiley:

PS: caso o volume de dados seja tao grande que memoria passa a ser um problema, a ideia do select count eh mais apropriada, mas mesmo assim, limite a query a retornar só o que vc quer, e copie pra uma Collection do mesmo jeito :wink:

qual a relação de um ResultSet com o banco para termos que se preocupar tanto com ele?

Simples: um ResultSet precisa manter uma conexão com o banco de dados aberta para se manter “vivo”. Logo, manter um ResultSet aberto por muito tempo é um processo muito caro, uma vez que você segura recursos (a conexão com o banco) que poderiam ser dispensados após a consulta.

por isso que há a opção de declarar no PreparedStatement se o ResultSet será rolável ou não e se ele pode modificar o banco :stuck_out_tongue:

Galera, com certeza usar ResultSet para apresentação de dados não é uma boa idea.

Esse foi um dos erros em um projeto em que trabalhei, a aplicação simplesmente ascentada, a quantidade de cursores abertos ficava gigante.

Passamos a usar o CachedRowSet da sun.

tb tive um grande problema usando ResultSet e deixando-o em aberto…
comigo aconteceu o seguinte problema.
Quando eu utilizava tal resultset em uma consulta normal na primeira vez ele funcionava normalmente, mas de forma lenta pois consumia recursos de conexão ao banco.
Na segunda vez que eu utilizava tal result em outra seleção de dados totalmente diferente da primeira… este ainda continha os dados da primeira consulta e adicionava os dados da segunda consulta, ou seja, o caus de informações inadequadas estava feito e eu fiquei um tempão me batendo pensando ser falha nos SQL´s.

Me digam uma coisa… tenho uma camada de banco de dados na minha aplicação…
Qual a melhor forma de gerenciar esses dados (muitos dados) para que não ocorra problema de memória e para que não use resultset, a melhor opção é mesmo collections? Uma vez que ainda sou muito iniciante e não manjo nada de frameworks, mas se alguém tiver um tut, ou melhor um artigo bom sobre hibernate, eu gostaria de ler… mas de preferência em portugues. Já lí os tuts da casa e ainda ficou muitas dúvidas.

P.S: A minha aplicação é para puro aprendizado…

A quantidade de dados possiveis que voce conseguira ter em memoria eh diretamente relacionado com a quantidade de memoria RAM disponivel.

Geralmente voce cria os objetos e popula eles ( por exemplo: vc consulta a tabela de noticias, entao para cada registro, cria e preenche os dados da entidade Noticia, e adiciona em um List ), e entao fecha as conexoes de banco e manipula os dados retornados como bem entender.

O melhor seria voce retornar apenas a quantidade que for precisar, e nao tudo sempre.

Rafael

Em relação a pergunta inicial, uma maneira facil de retornar a quantidade de linhas de um ResultSet:

[code]conDefault = clsConexao.obterConexaoNativaORCL();
pstmt = conDefault.prepareStatement(strSQL,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
pstmt.clearParameters();

        //parametro
        pstmt.setInt(1, pintContato);
		pstmt.setInt(2, pintSistema);
		pstmt.setInt(3, pintModulo);
        rsAcesso = pstmt.executeQuery();
		
rsAcesso.last();

intTotalAcessoPrograma = rsAcesso.getRow();
rsAcesso.beforeFirst();
[/code]