Problema com ResultSet[RESOLVIDO] - Interface?[RESOLVIDO]

Gente to com um problema em um resultSet que não sei o que está havendo, segue o código

if(cd.atualizaTab(3).first()){
            do{
                cd.atualizaTab(3).getInt(1);
                cd.atualizaTab(3).getString(2);
            }
            while(cd.atualizaTab(3).next());
        }

metodo atualizaTab:

public ResultSet atualizaTab(int cod) throws SQLException{
        rs = stm.executeQuery("SELECT fn.cod_fnconta, tp.tipo_pagamento FROM tipo_pag tp INNER JOIN fn_conta_tipo_pag fntp ON (fntp.cod_tipo_pag = tp.cod_tipo_pag) INNER JOIN fn_conta fn ON (fn.cod_fnconta = fntp.cod_conta) WHERE fn.cod_fnconta = " + cod);
        return rs;
    }

print da stack:

Exception in thread "main" org.postgresql.util.PSQLException: ResultSet não está posicionado corretamente, talvez você precise chamar next.
        at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkResultSet(AbstractJdbc2ResultSet.java:2635)
        at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getInt(AbstractJdbc2ResultSet.java:2005)
        at Classes.Main.main(Main.java:42)
Java Result: 1
  1. Um resultset é criado por padrão antes do primeiro registro. E você não deveria chamar first() sobre ele;
  2. Você deve chamar next() antes de ler os primeiros dados;

O seu código deveria ser mais ou menos assim:

whie (cd.atualizaTab(3).next()) {
   cd.atualizaTab(3).getInt(1);
   cd.atualizaTab(3).getString(2);
}
  1. Certifique-se de fechar os resultsets, statements e conexões após seu uso. Preferencialmente faça isso num finally.

[code]CadastroDeContas cd = new CadastroDeContas();

    while(cd.atualizaTab(3).next()){
        System.out.println(cd.atualizaTab(3).getInt(1));
        System.out.println(cd.atualizaTab(3).getInt(2));
        
    }[/code]

Mesmo erro de antes com o código acima:

Exception in thread "main" org.postgresql.util.PSQLException: ResultSet não está posicionado corretamente, talvez você precise chamar next.
        at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkResultSet(AbstractJdbc2ResultSet.java:2635)
        at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getInt(AbstractJdbc2ResultSet.java:2005)
        at Classes.Main.main(Main.java:40)
Java Result: 1

PS.: tentei tambem fazendo a validação do “.first()” e gerou a mesma exceção! D:

Esqueça o first().

É que toda vez que vc chama atualizaTab vc cria um resultset novo, o correto é criar somente uma vez:

[code]CadastroDeContas cd = new CadastroDeContas();

ResultSet rs = cd.atualizaTab(3);
while(rs.next()){
System.out.println(rs.getInt(“cod_fnconta”));
System.out.println(rs.getInt(“tipo_pagamento”));
}[/code]

Outra coisa. Sempre use os gets com o nome do campo, não com os índices. Isso facilita a manutenção, já que alterar a ordem das colunas no SQL ou incluir campos no meio dos já existentes não estragam esse código.

Sem contar que a perda de desempenho por usar nomes em vez de índices é exatamente zero. Uma vez eu fiz essa medida e vi que tanto faz usar nomes quanto índices em termos de desempenho, ou seja, sempre use nomes em vez de índices.
Eu acredito que só exista essa opção de usar índices porque você pode também fazer uma ferramenta que preencha uma JTable (por exemplo) a partir de um ResultSet sem precisar saber os nomes das colunas, mas isso é mais exceção que regra.

Ta certo era realment a criação do novo resultSet, soh uma coisa vinny, usando os get(String) não seria mais custoso em termos de performance do que o get(int) ??

vlw :smiley:

É mais lento? Sim.
É um problema por causa disso? Não.

A falta de clareza no código por usar os índices, além de depender das ordens dos campos é um inconveniente muitíssimo maior do que levar alguns milissegundos a mais para ler o dado.

Prefira sempre um código claro à um código otimizado. Você só deve pensar em reduzir a qualidade do código se você tiver em mãos um problema real de performance, comprovado por um profiler. Ainda assim, é importante seguir essas dicas:
http://www.guj.com.br/posts/list/15/31346.java#989991

Já que estamos falando de performance, vou mudar um pouco o foco, já li inumeras apostilas, mas até hoje não sei ql é a exata função de uma interface, tipo, ela soh instancia os metodos e deixam eles lá?

PS.: Disculpem a ignorancia! :B

Veja se vc entende lendo esses tópicos aqui:
http://www.guj.com.br/posts/list/55387.java#290673
http://www.guj.com.br/posts/list/51866.java#273117
http://www.guj.com.br/posts/list/51866.java#273137
http://www.guj.com.br/posts/list/51866.java#273198

Humm, seria mais ou menos obrigar a classe que implementa a interface a usar todos os metodos dela?

Esse é apenas um dos papéis. Acho que os dois papeis mais importantes das interfaces são:

  1. Deixar claro o que você espera receber como parâmetro;
  2. Abstrair de quem recebe a interface que classe real está associada à ela (exemplo do primeiro link).

Humm, acho q entendi =S