Retornando o numero de linhas em uma pesquisa SQL

Ola pessoal… estou tendo dificuldades em obter o numero de linhas retornadas por um SELECT em PostgreSQL. Eu tento da seguinta maneira:

... resultadoPesquisa = stm.executeQuery( sqlRua ); ...
E criei o seguinte metodo para retornar o numero de linhas:

[code] public int getNumberRows( ResultSet r )
{
int numResultados = 0;

	try
	{
		r.last();
		numResultados = r.getRow();
		r.first();
	}
	catch( SQLException exception )
	{
		exception.printStackTrace();
	}
	
	return numResultados;
}[/code]

Mas ao chamar o metodo recebo o seguinte:

org.postgresql.util.PSQLException: Operação requer um ResultSet rolável, mas este ResultSet é FORWARD_ONLY (somente para frente).

Alguem sabe como resolver?? Abracos!!!

Recebi o q?

nao apareceu ae xT

E o resultset no PostgreSQL não é um resultset rolável, rs.last(), rs.first(), ele apenas permite (pelo q sei) rs.next()

obs: Firebird trabalha com essa rolagem

[]'s

O Driver JDBC do PostgreSQL que você está usando não aceita você ir até o final e depois voltar para o primeiro registro (rs.first() ), isso é um problema do Driver. Você pode procurar outro driver ou outra solução, me desculpe mas eu nunca trabalhei com PostgreSQL :frowning:

adrianostanley,

Google is your friend :slight_smile:

Procurando por “java number of rows in ResultSet

Encontrei os seguintes links interessantes, dentre eles:
[url=http://javaalmanac.com/egs/java.sql/GetRow.html]Getting the Number of Rows in a Table Using a Scrollable Result Set[url]

Mas a idéia é criar um “Scrollable ResultSet”, assim:

        Statement stmt = connection.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE,      
            ResultSet.CONCUR_READ_ONLY);

Porque por default um resultset é “Forward only”.

Abraços!

Jah tentei passar esses argumentos pro construtor do ResultSet, mas ai ele nem exibe o resultado… mt estranho. Eu precisaria do numero de linhas pra criar um Object[][] para ser exibido numa JTable. Mas imagino que o mais recomendavel a se fazer eh usar um ArrayList ou algo do tipo.

O ResultSet tem um metodo getArray(int arg0) que retorna uma linha da consulta em Array. Jah tentei associar a um indice do arraylist mas nao funciona… nao sei pq…

Cara,

Acho que o único jeito para solucionar isso é fazer by the old way de fazer um COUNT(*) e depois fazer o SELECT completo. Para garantir que nada vai mudar entre os dois vc pode usar uma transação.

Que tal?

Abraços!

Pois eh… acabei usando o COUNT…

Eu imaginei q viesse uma funcao que retornasse o numero de linhas!!! Igual ao PHP, etc… mas eh isso ae…

Brigadao pela ajuda ae pessoal… intel+

Vale a pena dar uma olhada em Metadados:

http://www.guj.com.br/java.tutorial.artigo.24.1.guj

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);

stmt.executeQuery(sql);

rs.last();               
int rows = rs.getRow();        
rs.beforeFirst();

só que statement tem que ser criado desta maneira:

Sempre funcionou para mim… :slight_smile:

so p/ esclarecer:

esses codigos que criam um ResultSet navegavel em ambos os sentidos SOMENTE vão funcionar se o DRIVER JDBC implementar essas funcionalidades.
A API jdbc java é baseada em interfaces, os fabricantes de BD são quem implemetam as funcionalidades…

[]'s

Boa dia!
Costumo usar:

[code]
public static int getResultSetSize(ResultSet resultSet) {
int size = -1;

    try {
        resultSet.last();
        size = resultSet.getRow();
        resultSet.beforeFirst();
    } catch(SQLException e) {
        return size;
    }

    return size;
}[/code]

Talvez não seja a mais eficiente!
Boa sorte! :wink: