Retornar ResultSet [RESOLVIDO]

4 respostas
mauricionarcizo

Olá, boa tarde à todos, este é meu primeiro tópico e gostaria da ajuda de vocês...
Estou querendo refatorar o código do sistema da minha empresa, já que é repetido diversas vezes a mesma linha de codigo no sistema, entao criei o método abaixo para que retorne um resultset, mas esta dando erro no return

private ResultSet retornaConsulta(String sql) {
        try {
            Statement st = conn.createStatement();
            ResultSet rs = null;
            rs = st.executeQuery(sql);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

        return rs; //<erro aqui no rs, cannot find Symbol
    }

No método que irá chamar o retornaConsulta é assim

public void importaEstados() {
        Statement st;
        try {
            st = conn.createStatement();
            ResultSet rs = st.executeQuery("select * from estados");
            while (rs.next()) {
                String descricaoEstado = rs.getString("descricao");
                System.out.println("Salvando estado: " + descricaoEstado + " ");
                UF uf = new UF();
                uf.setNome(descricaoEstado);
                uf.setSigla(descricaoEstado);
                uf.setFreteMaritimo(rs.getBoolean("freteMaritimo"));
                salvaAcao.save(uf);
                System.out.println("Estado Salvo.");
            }
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
Então gostaria de refatorar para ficar apena assim
public void importaEstados() {
        try {
            ResultSet rs =retornaConsulta("select * from estados");
            while (rs.next()) {
                String descricaoEstado = rs.getString("descricao");
                System.out.println("Salvando estado: " + descricaoEstado + " ");
                UF uf = new UF();
                uf.setNome(descricaoEstado);
                uf.setSigla(descricaoEstado);
                uf.setFreteMaritimo(rs.getBoolean("freteMaritimo"));
                salvaAcao.save(uf);
                System.out.println("Estado Salvo.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

E refatorando com o metodo que eu estou fazendo, numa classe de 6k de linhas vai dar uma economia de linhas de código, e ficar melhor a manutenção. Então gostaria de saber o que está dando de erro no return do meu método.
Desde já agradeço a ajuda!

4 Respostas

xandevieira

Seria bom colocar o erro.

ViniGodoy
Variáveis só valem dentro do bloco de código (delimitado por chaves) onde foram declaradas. Esse é um conceito básico de escopo. No seu caso, há um bloco do try, e a variável foi criada lá dentro. Ela obviamente não será visível fora. Para resolver, declare o resultset fora do try:
private ResultSet retornaConsulta(String sql) {
        ResultSet rs = null;
        try {
            Statement st = conn.createStatement();

            rs = st.executeQuery(sql);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

        return rs; 
    }
>
ViniGodoy

Esse código, aliás, tem diversos problemas:
a) Mantém conexões e statements abertos;
b) Mantém o ResultSet aberto.
c) Não tem o cuidado de fechar nada no finally.

Se quiser refatorar o código da sua empresa de verdade, adicione o Spring no seu projeto, e use as classes dele. Ele copia o conteúdo do ResultSet para um CachedRowSet automaticamente, e mantém tudo fechado: conexões, statements e resultsets. Evita assim desperdício de recursos na sua aplicação, ou leaks que podem levar ao crash.

mauricionarcizo

Valeu ViniGodoy pelas duas dicas, o erro que estava dando antes foi resolvido, e o resto irei estudar e aplicar.

Criado 11 de julho de 2011
Ultima resposta 11 de jul. de 2011
Respostas 4
Participantes 3