Erro loop no select

10 respostas
T

Pessoal to tentando fazer os produtos deste pedido subtrair no banco, mas não to conseguindo... ele tem q pegar os resultados e ficar em loop até não ter mais produtos para subtrair ... mas ele não fica em loop... ele faz isso só uma vez... depois dá um erro... pode ser q esteja errada está forma de fazer duas select e um while dentro do outro desta forma... mas não sei como fazer diferente.. se alguem puder me ajudar....

numeroPedido=texNumeroPedido.getText();
rs = st.executeQuery("Select quantidade,codigoProduto from pedidoproduto where codPedido ="+numeroPedido);
			
while (rs.next())
{
codProduto = String.valueOf(rs.getString("codigoProduto"));
valor=String.valueOf(rs.getString("quantidade"));
n=Integer.parseInt(valor);
res=st.executeQuery("Select quantidade from estoque where codProduto ='"+codProduto+"'");
         while (res.next())
         {
	          quantidade=String.valueOf(res.getString("quantidade"));
	          num=Integer.parseInt(quantidade);
         }
	estoque=num-n;
	String sql="Update estoque set quantidade='"+estoque+"',data='";
sql+=texFData.getText()+"'where codProduto='" +codProduto+ "'";
st.execute(sql);
}
con.close();

O erro é:
java.sql.SQLException: Operation not allowed after ResultSet closed

Eu agradeço se alguém puder me ajudar.... :lol:

10 Respostas

F

Cara, acho que o erro ta no codProduto, onde voce pois ele entre aspas simples (’’), esse compo realmente é uma String (ou VARCHAR) para estar entre aspas. Pois ate onde sei se coloca assim, datas ou campos do tipo varchar… e geralmente um Codigo é do tipo INT ou INTEGER!!!

Posso estar enganado, mas é o que eu vi de estranho no teu codigo![/b]

M

em qual linha exatamente da o erro !???

T

Pessoal, este codProduto realmente é um varchar, por isso está entre aspas simples ‘’.
E como disse no meu tópico, ele não dá erro na hora de compilar, ele dá erro depois que executo e faz o primeiro loop… tipow… pra eu testar coloquei dois registros com este codProduto, q teria q pegar a quantidade dos mesmos, ir até tabela estoque e subtrair do estoque esses dois produtos, mas ele só faz isso com o primeiro registro… Ele não fica em loop até não ter mais registros para ser retirado do estoque. Ele dá erro qdo ele vai entrar no loop.

Será q alguém tem mais alguma sugestão… :roll:

Agradeço… :lol:

F

Atah!.. tenta o seguinte… coloca o loop assim:

...
do {
//o codigo todo
} while(res.next)

acho que dai vai… pelo menos eu fasso nos meus loops com o BD…

T

“felipelo”:
Atah!.. tenta o seguinte… coloca o loop assim:

...
do {
//o codigo todo
} while(res.next)

acho que dai vai… pelo menos eu fasso nos meus loops com o BD…

Eu teste mas não deu certo :cry: … qdo coloco do{} ele nem pega os resultados… ele dá erro antes de entrar no loop. O erro é o seguinte:
Java.sql.SQLException: Before start of result set…
Alguém tem mais uma dica… :roll:

F

Bom, vamos inscisti nesse erro…

essa query que tu ta executando, tu nao precisa colocar “;” no final, digo, da String mesmo… tipo:

e…

String sql="Update estoque set quantidade='"+estoque+"',data='"; sql+=texFData.getText()+"'where codProduto='" +codProduto+ "'";

Para:

String sql="UPDATE estoque SET quantidade= '" + estoque + "', data='" +; sql+=texFData.getText() + "' WHERE codProduto='" + codProduto + "';";

Voce entede o que eu quis fazer?? Pois pelo menos eu sempre termino um comando de SQL com o “;”, nao sei se o seu banco suporta sem, mas eu uso MySQL e sempre foi assim. E Acredito que muitos outros tb.

Abracos!

T

“felipelo”:
Bom, vamos inscisti nesse erro…

essa query que tu ta executando, tu nao precisa colocar “;” no final, digo, da String mesmo… tipo:

e…

String sql="Update estoque set quantidade='"+estoque+"',data='"; sql+=texFData.getText()+"'where codProduto='" +codProduto+ "'";

Para:

String sql="UPDATE estoque SET quantidade= '" + estoque + "', data='" +; sql+=texFData.getText() + "' WHERE codProduto='" + codProduto + "';";

Voce entede o que eu quis fazer?? Pois pelo menos eu sempre termino um comando de SQL com o “;”, nao sei se o seu banco suporta sem, mas eu uso MySQL e sempre foi assim. E Acredito que muitos outros tb.

Abracos!

Na verdade nunca usei “;”, pra que serve exatemente colocar as “” aí…
Qdo chegar em casa vou testar pra ver se funciona…
Mas só por curiosidade o que estas aspas tá querendo dizer ao banco? :oops:

Valeu…

T

“felipelo”:
Bom, vamos inscisti nesse erro…

essa query que tu ta executando, tu nao precisa colocar “;” no final, digo, da String mesmo… tipo:

e…

String sql="Update estoque set quantidade='"+estoque+"',data='"; sql+=texFData.getText()+"'where codProduto='" +codProduto+ "'";

Para:

String sql="UPDATE estoque SET quantidade= '" + estoque + "', data='" +; sql+=texFData.getText() + "' WHERE codProduto='" + codProduto + "';";

Voce entede o que eu quis fazer?? Pois pelo menos eu sempre termino um comando de SQL com o “;”, nao sei se o seu banco suporta sem, mas eu uso MySQL e sempre foi assim. E Acredito que muitos outros tb.

Abracos!

Testei e não adiantou… continua dando o mesmo erro…
Acho q o erro é só nessa parte do select pois eu deixei só como comentário esta parte do UPDATE pra eu ir testando o sistema… e pra eu ver os resultados fui dando print… assim vejo quantas vezes está sendo realizado o loop… e é realizado umá única vez mesmo!

Valeu!

G

Kra, colocar uma consulta em loop é uma PÉSSIMA prátiica, tenho certeza que é possível fazer essa busca com uma única query fazendo uma query melhor elaborada, em todo caso, em QUAL LINHA ocorre o erro?

G

Kra, achei o erro.

Como eu suspeitava, não se pode manter mais de um ResultSet por Statement SIMULTANEAMENTE, dessa forma como vc está fazendo.

Retirado da especificação da Interface Statement:

public interface Statement

The object used for executing a static SQL statement and returning the results it produces. 

By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.

Espero ter ajudado
[]'s

Criado 21 de agosto de 2005
Ultima resposta 23 de abr. de 2006
Respostas 10
Participantes 4