Duvida ResultSet

11 respostas
H

Tava kerendo um metodo q me retorne o numero de linhas de 1 select num ResultSet, procurei na api, encontrei getFetchSize(), mas fiquei na duvida qto a descricao dele, alguem ja usou este metodo e sabe dizer se eh p isto msm ou algum outro q retorne o tamanho d linhas do resultSet? Por enqto, vou testando, vlws…

11 Respostas

ramilani12

Prq vc não usa o retorno do SQL , usando a função COUNT() retornando a qtde de registros que SELECT atingiu ?

SELECT COUNT(campo) AS numLinhas FROM tabela
int numLinhas = rs.getInt("numLinhas");
H

Vlw a dica, mas se tivesse um metodo no proprio resultSet seria melhor, pois se n, vo ter q fazer este select em tds os metodos da minha persistencia (e eu acho meio “feio”). Se n tiver jeito vo fazer assi msm.

Mas vlw sim.

rissato

Já pensou em criar um método, extendendo a classe ResultSet?

KWill

ResultSet num é uma interface? Acho que você quis dizer implementar ResultSet

cado

Procure sobre ResultSetMetaData.

Metadados do JDBC.

Tem um tutorial no GUJ.
http://www.guj.com.br/java.tutorial.artigo.24.1.guj

[ ]'s

H

bem, lembrando q o q eu kero eh extrair os dados (inclusive o nome das colunas) do ResultSet p/ uma string, pois eu vo trafegar essa String[][] pela rede e o objeto ResultSet (infelizmente) n eh serializavel.

axo q implementar resultSet n seria a opcao mais facil, mas vlw a dica. eu queria saber se tem algum metodo q me dar o numero de linahs do meu resultSet ou uma solucao p isso, pois preciso disto p extrair os dados do resultset e jogar na String[][].

H

cado:
Procure sobre ResultSetMetaData.

Metadados do JDBC.

Tem um tutorial no GUJ.
http://www.guj.com.br/java.tutorial.artigo.24.1.guj

[ ]'s

Metadados n eh so p pegar as colunas??? Eu to usando metadados p extrair os nomes e qtd das colunas. Linhas sao outros 500.

KWill

Revirando os meus códigos anteriores, lembrei de um jeito de pegar o número de linhas de um ResultSet:

Statement seuStatement;
String suaQuery;
ResultSet seuResultSet = seuStatement.executeQuery(suaQuery);
seuResultSet.last();
int numLinhas = seuResultSet.getRow();
seuResultSet.beforeFirst();

Basicamente, você vai até o último Row do ResultSet e depois pega o índice desse último Row. Usa-se o beforeFirst() para que o cursor do ResultSet volte ao estado inicial.

Veja se funciona por ai

inté

dbispo

Lembrando que para o método apresentado acima, vc terá que criar um resultset navegável, pois resultsets são, por default, foward only. Para tornar o resultset navegável, quando criar o Statement faça o seguinte:

Statement seuStatement = suaConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

A porpriedade de navegação dependerá do driver que você estiver utilizando.
Ver: http://www.guj.com.br/posts/list/42271.java#224882

H

vlw povo, eu ia fazer este esclarecimento q o bispo fez, blz entao.

este negocio de trafegar resultSet pela rede, vcs fizeram como eu fiz? extraindo o resultado p uma string[][] e enviar via rede p a interface do cliente? pq eu achei a maneira mais facil, e queria saber se tava implementando semelhante ao que o pessoal faz.

H

Ae galerinha, consegui, vo disponibilizar o codigo, caso alguem necessite, lembrando q nele, eu dou 1 select e retiro (jogando numa Strting[][]) tanto as colunas, qtos os dados do ResultSet, q podem ser jogados num JTable via rede (ja q o ResultSet n pode trafegar em rede), por exemplo:

public String[][] listaSistemas() throws RemoteException {
        Statement stmt;
        ResultSet rs = null;
        String[][] dados = null; 
        
        try { 
            stmt = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            String query = "SELECT s.id, s.nome, s.estado, s.descricao, s.dir_documentacao, s.data_inicio, s.data_previsao, " +
                           "s.data_validacao, s.data_atraso, s.causa_atraso, c.num_contrato, p.nome, b.nome, l.nome FROM sistema s, " +
                           "contrato c, plataforma p, banco_dados b, linguagem l WHERE (c.num_contrato = s.fk_contrato) " +
                           "AND (p.id = s.fk_plataforma) AND (b.id = s.fk_banco_dados) AND (l.id = s.fk_linguagem);";
            rs = stmt.executeQuery(query);
            ResultSetMetaData rsmd = rs.getMetaData();
            int numColunas = rsmd.getColumnCount();
            rs.last();
            int numLinhas = rs.getRow();
            dados = new String[numLinhas+1][numColunas];
            for (int i=0; i<numColunas; i++) 
                dados[0][i] = rsmd.getColumnName(i+1);
            int k=0;
            rs.beforeFirst();
            while (rs.next()) {
                k++;    
                for (int i=0; i<numColunas; i++) 
                    dados[k][i] = rs.getString(i+1);
            }
        } catch (SQLException sqle) {
            System.err.println("Erro: SQL Exception");
            sqle.printStackTrace();
        }
        return dados;
    }

Qlq duvida, so perguntar

Criado 9 de outubro de 2006
Ultima resposta 10 de out. de 2006
Respostas 11
Participantes 6