ResultSet

41 respostas
APaulinha

Boa tarde a todos!

Estou utilizando um metodo que apartir do resultSet retorna para minha aplicação se o registro procurado existe ou não no banco de dados.
Quando faço a consulta diretamente no banco um resultado é gerado, mas o resultSet não me retorna nada.
Estou usando o postgres.

Alguém poderia me ajudar?

Abaixo o código.

public boolean existenciaDaAnalise(Analise a) throws SQLException{
        String sql = "SELECT idanalise FROM analise WHERE idamostraanalise = ?";

        PreparedStatement ps = Conexao.getPreparedStatement(sql);
        ps.setInt(1, a.getIdDaAmostra());

        ResultSet rs = ps.executeQuery();
        
        while(rs.next()){
            a.setIdDaAnalise(rs.getInt("idanalise"));
            ps.close();
            rs.close();
            return true;
        }

        ps.close();
        rs.close();
        return false;
    }

Grata desde já.

Ana Paula

41 Respostas

G

mals o prepared num ta errado nao viajei no que eu vi…

while(rs.next()){ a.setIdDaAnalise(rs.getInt("idanalise")); ps.close(); rs.close(); return true; }
não fexe a conexão do ps e do rs dentro do while,pois ela nao vai abrir do nada depois

luisgarcia173

Querida Ana Paula,

Alterei um pouco seu código, mas acho que seu problema não é esse até porque não gerou nenhuma mensagem de erro sua aplicação.

Verifica se os dados de conexão que está passando estão apontando para a base correta.

public boolean existenciaDaAnalise(Analise a) throws SQLException{   
    
    boolean retorno = false;
    String sql = "SELECT idanalise FROM analise WHERE idamostraanalise = ?";   
  
    PreparedStatement ps = Conexao.getPreparedStatement(sql);   
    ps.setInt(1, a.getIdDaAmostra());   
  
    ResultSet rs = ps.executeQuery();   
       
    while(rs.next()){   
        a.setIdDaAnalise(rs.getInt("idanalise"));
        retorno = true;
    }   
  
    rs.close(); 
    ps.close();
  
    return retorno;   
}
APaulinha

Obrigada pelas respostas!

Só fechei a conexão dentro do while pois só preciso saber se a consulta retorna null ou não. Na primeira interação do while eu já teria a informação que preciso, então fecho o rs e o ps e retorno a informação que preciso. :oops:

A base está correta sim, já verifiquei!
Pensei que o problema pudesse ser no jar, baixei novamente o jar atualizei no projeto. Mas o problema persistiu.
Obrigada pela alteração no código. :slight_smile:

kenneth

Hummm…

Ja tentou com o first()?

public boolean existenciaDaAnalise(Analise a) throws SQLException{
        String sql = "SELECT idanalise FROM analise WHERE idamostraanalise = ?";
        boolean retorno = false;

        PreparedStatement ps = Conexao.getPreparedStatement(sql);
        ps.setInt(1, a.getIdDaAmostra());

        ResultSet rs = ps.executeQuery();

        retorno = rs.first();
        
        ps.close();
        rs.close();
        return retorno;
    }
ViniGodoy

O first não tem nada a ver:

  1. Ele só funciona com resultSets que sejam completamente navegáveis, não com os forward only;
  2. Ele só faz o que o next() já faz nesse caso.

Já rodou no passo-a-passo? E verificou se o a.getIdAmostra() retornado é mesmo o valor que você espera?

Tem um detalhe. É uma boa prática fechar a conexão, statement e resultset num finally após a execução das queries. Caso contrário, seu programa poderá estourar por falta de memória.

Carlos_ds_jar

Paulinha, como está a sua classe de Conexão?

APaulinha

Bom dia, Pessoal!!!

Paulinha, como está a sua classe de Conexão?

Acredito que o problema não esteja na classe de conexão, pois já tenho várias consultas que utilizam a mesma classe e funcionam perfeitamente.
A classe está aí...

public class Conexao {

    private static final String JDBC_DRIVER = "org.postgresql.Driver";
    private static final String DATABASE_URL = "jdbc:postgresql://localhost:5432/meubanco";
    private static final String USER = "postgres";
    private static final String PASS = "*********";
    private static Connection conection;

    public static Connection getConnection() throws SQLException {
        try {
            return singletonConnection();
        } catch (ClassNotFoundException e) {
            throw new SQLException(e.getMessage());
        }
    }

    public static PreparedStatement getPreparedStatement(String sql) throws SQLException {
        return getConnection().prepareStatement(sql);
    }

    private static Connection singletonConnection() throws SQLException, ClassNotFoundException {
        if (conection == null) {
            Class.forName(getJDBC_DRIVER());
            conection = DriverManager.getConnection(getDATABASE_URL(),
                    getUSER(), getPASS());
        }
        return conection;
    }

}
Já rodou no passo-a-passo? E verificou se o a.getIdAmostra() retornado é mesmo o valor que você espera?

Já rodei passo a passo. O a.getIdAmostra() retorna o valor certinho. Dou um print no sql com o valor de a.getIdAmostra() e copio o mesmo para o banco de dados e tenho um resultado. :?

Ja tentou com o first()?

O codigo que você me sugeriu retornou o seguinte erro:

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

Muito obrigada a todos.

ViniGodoy

APaulinha:
O codigo que você me sugeriu retornou o seguinte erro:

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

Isso foi por causa do motivo 1, que citei ali em cima. O first() não resolve o problema.
O estranho é que rodar o SQL no banco funciona. Não dispara nenhuma exception? O código só nao entra no while?

pmlm

De certeza que a.getIdDaAmostra() é o mesmo valor com que testas na BD?

APaulinha

Não há exceptions.
Posso forçar qualquer idamostraanalise que o ResultSet não me retorna nada.

APaulinha

Tenho certeza que o a.getIdDaAmostra() é o mesmo.

pois dou um print em todo código:

public boolean existenciaDaAnalise(Analise a) throws SQLException{

        boolean retorno = false;

        System.out.println("a.getIdDaAnalise: "+a.getIdDaAmostra());

        String sql = "SELECT idanalise FROM analise WHERE idamostraanalise = ?";

        PreparedStatement ps = Conexao.getPreparedStatement(sql);
        ps.setInt(1, a.getIdDaAmostra());

        System.out.println("ps: "+ps);

        ResultSet rs = ps.executeQuery();
        
        while(rs.next()){
            System.out.println("WHILE");
            a.setIdDaAnalise(rs.getInt("idanalise"));
            retorno = true;
        }

        ps.close();
        rs.close();
        return retorno;
    }

aí copio no banco o sql retornado pelo print:

a.getIdDaAnalise: 10505
ps: SELECT idanalise FROM analise WHERE idamostraanalise = 10505
Return existenciaDaAnalise: false
pmlm

De certeza que a BD é a mesma? :slight_smile:

Se não colocares a cláusula WHERE devolve dados?

nel

Bom dia.

O campo ‘idamostraanalise’ é um int no seu banco de dados?

Edit: correção, pois havia me confundido em um detalhe, mas considere a pergunta acima.

Abraços.

ViniGodoy

Aliás, é sempre uma boa usar os nomes de colunas ao invés de índices do PreparedStatement. Até porque, isso torna o seu código mais imune a mudanças na estrutura do banco.

APaulinha

A base de dados é a mesma! Só tenho uma base, apaguei tudo que pudesse ser replicado.

Sem a clausula WHERE eu tenho resultados!

APaulinha

Sim é um int.

nel

Edit: foi respondido acima.

APaulinha

?

pmlm

E se imprimires os valores devolvidos tens o valor que não encontras quando pões o WHERE?

nel

Eu tinha refeito a pergunta se era um tipo Int, pois poderia ser uma String ou qualquer outro tipo.
Tente alterar sua query : "SELECT idanalise FROM analise WHERE idamostraanalise = ?"

Para : "SELECT a.idanalise FROM analise a WHERE a.idamostraanalise = ?"

Veja se o resultado é o mesmo.
E o System.out.println(“WHERE”) não é apresentado na tela, aquele resultado que você postou anteriormente já havia esta linha ou você adicionou depois?
Pergunto apenas para confirmar que não está “caindo” na clausula while.

APaulinha

Alterei a consulta como você me indicou e o resultado dos prints foram:

a.getIdDaAnalise: 10505 ps: SELECT a.idanalise FROM analise a WHERE a.idamostraanalise = 10505 Return existenciaDaAnalise: false

o System.out.println(“WHILE”) não apareceu.

nel

Sinceramente, não sei o que está ocorrendo.
Por favor, execute esta mesma query que indiquei no seu banco de dados, tire um print com a query e o resultado e apresente para nós, pode ser? :slight_smile:

Você deve ter um framework para acesso direto ao banco certo?

marcelo.bellissimo

Realmente, tá muito estranho isso… aproveita e manda pra gente a estrutura da sua tabela, tem algum detalhe aí que não estamos vendo…

nel

Concordo.

marcelo.bellissimo

Concordo.
Tô até baixando o MySQL pra ver se consigo simular isso, hehehe… :lol:

nel

Concordo.
Tô até baixando o MySQL pra ver se consigo simular isso, hehehe… :lol:

rs…ai já é mais complicado já que estou no trabalho.
Mas fiquei realmente curioso para saber o que está ocorrendo.

Suspeito que o código seja inexistente ou não se trata de um tipo Inteiro na tabela, mas enfim.
Vamos aguardar o post dela :slight_smile:

APaulinha

Parte da tabela do banco:

APaulinha

Cópia do SQL e resultado:



APaulinha

Tenho!

nel

Olá!

Percebeu que na Query você usou o código 10510 e no Java usou o código 10505 ? :slight_smile:

APaulinha

:frowning:
Mas com o 10505 também tem resultado.

Independente do valor de a.getIdDaAmostra() nunca entra no while.

nel

Poste a estrutura da tabela, pode ser? :slight_smile:
Curiosidade está grande para descobrir o que está ocorrendo.

Outro detalhe, há outras querys em seu sistema que utilizam da mesma lógica aplicada por você neste método em particular que funcionam perfeitamente, certo?

Edit: adicione o campo idamostraanalise no select, ou seja, select a.idamostraanalise… e poste a imagem como acima :slight_smile:

APaulinha

Existem sim. Porém com outras tabelas do banco. E está exatamente igual só muda o sql. :?

CREATE TABLE analise ( idanalise integer NOT NULL DEFAULT nextval('analise_id_seq'::regclass), idamostraanalise integer NOT NULL, inversaoprofundidadeanalise boolean, CONSTRAINT idanaliseprimarykey PRIMARY KEY (idanalise), CONSTRAINT idamostraanalise FOREIGN KEY (idamostraanalise) REFERENCES amostra (idamostra) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION )

ViniGodoy

Já mandou benzer seu driver de banco de dados?

APaulinha

KKKKK… Benzer ainda, não!
Mas já troquei ele e não funcionou…

nel

rsrs boa Viny.
Está realmente, muito “sinistro” isso hein! hehe…

APaulinha, tenta alterar o seu ps.setInt para…

ps.setObject(1, 10505, java.sql.Types.INTEGER);

Adicionei a biblioteca da classe Types para não haver confusão, mas pode abstrair ela.

APaulinha

Não foi… :cry:

pmlm

Dá-me o output disto…

public boolean existenciaDaAnalise(Analise a) throws SQLException{  
   
         boolean retorno = false;  
   
   //      System.out.println("a.getIdDaAnalise: "+a.getIdDaAmostra());  
   
         String sql = "SELECT idanalise,  idamostraanalise  FROM analise where idmostraanalise = 10505";  
   
         PreparedStatement ps = Conexao.getPreparedStatement(sql);  
   //      ps.setInt(1, a.getIdDaAmostra());  
   
         System.out.println("ps: "+ps);  
   
         ResultSet rs = ps.executeQuery();  
           
         while(rs.next()){  
             System.out.println(rset.getInt("idanalise") + " " + rset.getInt("idmostraanalise"));  
            
             retorno = true;  
         }  
   
         ps.close();  
         rs.close();  
         return retorno;  
     }
nel

Se eu tivesse postgress aqui eu juro que montava o sistema igual o seu para testar.
Bom, tenta algo por curiosidade, faça a seguinte query:

SELECT * FROM analise a WHERE a.idamostraanalise = ?

Se não funcionar, substitua o campo idamostraanalise por outro da tabela, como o proprio id e ‘set’ um valor fixo, apenas por questão de teste.
Não esqueça de utilizar o “apelido” da tabela na query, ou seja, ‘a.idamostraanalise’, isso força você a digitar corretamente o nome da coluna.

APaulinha

ps: SELECT idanalise, idamostraanalise FROM analise where idamostraanalise = 10505 Return existenciaDaAnalise: false

pmlm

E o mesmo SQL directamente na BD dá dados… certo?

Quando foram introduzidos os dados na BD?

Criado 23 de agosto de 2010
Ultima resposta 24 de ago. de 2010
Respostas 41
Participantes 9