Rs.RowCount(); Como fazer isso em java?

rs.RowCount

No vbscript tem essa função que informa a quantidade de linhas que a sua query retornou.
E em java, como fazer isso? Não achei nenhum método até agora da classe ResultSet que faça isto.

Será possível que vou ter que executar um SELECT COUNT toda vez que precisar obter a quantidade de linhas retornadas por uma query??

[]´s!!!

Isso ou durante o while(rs.next()) incrementar um contador… :confused:

Já vi alguns sites com esta disucssão, dá uma googlada que você acha…

A maneira em Java é pouco elegante, chega a parecer xunxo.

Mas é assim.

[code]//Crie um result statement navegável
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery(sql); //Rode um sql qualquer
rs.last(); //Vá para a última linha do resultSet:
int rows = rs.getRow(); //Pegue o número da linha
rs.beforeFirst(); //Se necessário, volte para o início.[/code]

Aêêêê!!!
Mandou muito bem!!! :smiley:
Valeu!!!
[]´s!!!

[quote=ViniGodoy]A maneira em Java é pouco elegante, chega a parecer xunxo.

Mas é assim.

[code]//Crie um result statement navegável
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery(sql); //Rode um sql qualquer
rs.last(); //Vá para a última linha do resultSet:
int rows = rs.getRow(); //Pegue o número da linha
rs.beforeFirst(); //Se necessário, volte para o início.[/code][/quote]

so lembrando que nem todos drivers implementam corretamento a a navegacao no ResultSet.

[]'s

resultSet.getMetaData().getColumnCount();     

Mas fácil.

[quote=vitu]resultSet.getMetaData().getColumnCount();

Mas fácil.
[/quote]
Vitu, estamos falando sobre a contagem de linhas, e não de colunas ok?!

Aí Vini, quando eu chamo o rs.last() dá a seguinte exceção!!! (já rolou contigo isso?) =/

[quote]java.sql.SQLException: Operação inválida para encaminhar apenas conjunto de resultados: last
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)[/quote]

Tava bom d+…
Será q é por causa do que o jgbt falou???

[quote=Rage]Vitu, estamos falando sobre a contagem de linhas, e não de colunas ok?!

Aí Vini, quando eu chamo o rs.last() dá a seguinte exceção!!! (já rolou contigo isso?) =/

[quote]java.sql.SQLException: Operação inválida para encaminhar apenas conjunto de resultados: last
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)[/quote]

Tava bom d+…
Será q é por causa do que o jgbt falou???[/quote]

vc ta usando bd oracle?
se sim, o driver da oracle implementa corretamente a navegacao no ResultSet
me parece que vc nao ta usando o driver padrao da oracle.

[]'s

Pq não usa o driver Oracle thin, que vem junto dos arquivos da própria Oracle?

Ele funciona bem para isso, já testamos.

Sim, estou usando Oracle 9i!

Antes de ver a questão do driver, creio que posso estar fazendo algo de maneira equivocada:
Ao criar meu ResultSet, não estou sabendo como setar o tipo de scroll.
Acho falta as configurações que você citou
(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)

try { String query = "SELECT * FROM user.tablej WHERE rownum <= 8"; conn = getConnection(); pstmt = conn.prepareStatement(query); rs = pstmt.executeQuery(); rs.last(); int rsSize = rs.getRow();
Como configuro isto usando PreparedStatement ao invés do Statement?
O driver que estou usando é o classes12.jar (baixei no próprio site da oracle)

[]´s!!!

Beleza kras, acho que conseguí!!! :slight_smile:

try { String query = "SELECT * FROM user.tablex WHERE rownum <= 20"; conn = getConnection(); pstmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = pstmt.executeQuery(); rs.last(); int rsSize = rs.getRow(); System.out.println("rsSize: "+ rsSize);Valeu pela ajuda!!! 8)
[]´s!

Mas… vamos falar a verdade… soluçãozinha tosca, né?

Achei a recomendação num site da sun…

[quote=Rage]Beleza kras, acho que conseguí!!! :slight_smile:

try { String query = "SELECT * FROM user.tablex WHERE rownum <= 20"; conn = getConnection(); pstmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = pstmt.executeQuery(); rs.last(); int rsSize = rs.getRow(); System.out.println("rsSize: "+ rsSize);Valeu pela ajuda!!! 8)
[]´s! [/quote]

Prefiro muito mais criar um método com “SELECT COUNT…” e chamá-lo toda vez que precisar atualizar a quantidade de linhas…
Esse método não me inspira muita confiança não…
Rsrsrs…

[quote=ViniGodoy]Mas… vamos falar a verdade… soluçãozinha tosca, né?
Achei a recomendação num site da sun…[/quote]

Verdade, solução tosca.
Difícil acreditar que os caras não pensaram em algo mais prático pra obter isso, uma coisa tão elementar, tão básica e essencial…

[quote=Linkel]Prefiro muito mais criar um método com “SELECT COUNT…” e chamá-lo toda vez que precisar atualizar a quantidade de linhas…
Esse método não me inspira muita confiança não…
Rsrsrs…[/quote]

Tem razão, se houver tempo vou criar um método genérico que possa de alguma maneira ser acessado retornando o count de diferentes queryes…por hora vai ficar assim mesmo, pois está funcionando!
[]´s

[quote=Linkel][quote=Rage]Beleza kras, acho que conseguí!!! :slight_smile:

try { String query = "SELECT * FROM user.tablex WHERE rownum <= 20"; conn = getConnection(); pstmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = pstmt.executeQuery(); rs.last(); int rsSize = rs.getRow(); System.out.println("rsSize: "+ rsSize);Valeu pela ajuda!!! 8)
[]´s! [/quote]

Prefiro muito mais criar um método com “SELECT COUNT…” e chamá-lo toda vez que precisar atualizar a quantidade de linhas…
Esse método não me inspira muita confiança não…
Rsrsrs…[/quote]

E duplicar o acesso ao banco para essas queries? Sei lá, tem que ver com calma se sempre vale à pena isso…

Realmente, o SELECT COUNT pode ficar mais elegante, mas duplica o acesso ao banco.

na real dependendo da situação, cada solução pode ser util.
se é para otimizar, vale apena criar um contador e incrementa-lo dentro do while do ResultSet, semprecisar nem mesmo navegar no ResultSet para descobri o numero de linhas.

[]'s

Cara,

Se vc precisa do rowcount no final da varredura do ResultSet, faça um contador. Senão, a melhor solução é tu criar um método que englobe o teu select principal com o “SELECT COUNT(1) AS ROW_COUNT FROM (” + teu SQL + “)” para fazer o count da tua consulta. Lembrando que será mais performático tu usar a mesma connection. Se nao me engano nas novas versões do jdbc ja tem coisa implementada pra isso.