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.
publicbooleanexistenciaDaAnalise(Analisea)throwsSQLException{
Stringsql="SELECT idanalise FROM analise WHERE idamostraanalise = ?";PreparedStatementps=Conexao.getPreparedStatement(sql);ps.setInt(1,a.getIdDaAmostra());ResultSetrs=ps.executeQuery();while(rs.next()){
a.setIdDaAnalise(rs.getInt("idanalise"));ps.close();rs.close();returntrue;}
ps.close();rs.close();returnfalse;}
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.
publicbooleanexistenciaDaAnalise(Analisea)throwsSQLException{booleanretorno=false;Stringsql="SELECT idanalise FROM analise WHERE idamostraanalise = ?"; PreparedStatementps=Conexao.getPreparedStatement(sql); ps.setInt(1,a.getIdDaAmostra()); ResultSetrs=ps.executeQuery(); while(rs.next()){a.setIdDaAnalise(rs.getInt("idanalise"));retorno=true;}rs.close(); ps.close();returnretorno;
}
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.
kenneth
Hummm…
Ja tentou com o first()?
publicbooleanexistenciaDaAnalise(Analisea)throwsSQLException{
Stringsql="SELECT idanalise FROM analise WHERE idamostraanalise = ?";booleanretorno=false;PreparedStatementps=Conexao.getPreparedStatement(sql);ps.setInt(1,a.getIdDaAmostra());ResultSetrs=ps.executeQuery();retorno=rs.first();ps.close();rs.close();returnretorno;}
ViniGodoy
O first não tem nada a ver:
Ele só funciona com resultSets que sejam completamente navegáveis, não com os forward only;
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í...
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.
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?
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
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 ?
APaulinha
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?
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
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.
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*FROManaliseaWHEREa.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