Looping para ir retirando itens

2 respostas
rodolpho.netto

Fiz um loop para quando alguem cancelar um pedido, ele devolta o estoque de cada item novamente para a tabela do produto

resumindo, fica gravado o item do pedido, e sua quantidade, se eu cancelar ele devolve aquela quantidade para o produto, segue anexo como eu fiz e o erro

public void cancelarPedido(){
              String id_pedido2 = ednpedido.getText();
              String sql = "SELECT * FROM `item_pedido` WHERE id_pedido = '"+id_pedido2+"'";
              try {
            con.executeSQL(sql);
            con.resultset.first();
            do
            {
            
                
                          
              String insere3SQL = "UPDATE produto SET qtd =`qtd`+ qtd WHERE id_prod IN ( SELECT id_prod "+
                                  "FROM item_pedido "+
                                  "WHERE id_pedido = '"+id_pedido2+"')";
                try {
                    con.statemente.executeUpdate(insere3SQL);
                }
                catch (SQLException ex) {
                            System.out.println("Erro: "+ex.getMessage());
             }
              
              
              String insere6SQL = "DELETE FROM item_pedido WHERE id_pedido = '"+id_pedido2+"'";
              String insere7SQL = "DELETE FROM pedido WHERE id_pedido = '"+id_pedido2+"'";
            try {
                con.statemente.executeUpdate(insere6SQL);
            }
            catch (SQLException ex) {
                        System.out.println("Erro: "+ex.getMessage());
            }  
            try {
                con.statemente.executeUpdate(insere7SQL);
            }
            catch (SQLException ex) {
                        System.out.println("Erro: "+ex.getMessage());
            }    
                
            }while(con.resultset.next());
        } catch (SQLException ex) {
            Logger.getLogger(cad_pedido.class.getName()).log(Level.SEVERE, null, ex);
        }
  
               cad_pedido.this.dispose();
            }
Set 23, 2012 1:22:06 PM yamada3.cad_pedido cancelarPedido
Grave: null
java.sql.SQLException: Operation not allowed after ResultSet closed
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:796)
	at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6857)
	at yamada3.cad_pedido.cancelarPedido(cad_pedido.java:411)
	at yamada3.cad_pedido.canvenActionPerformed(cad_pedido.java:833)
	at yamada3.cad_pedido.access$500(cad_pedido.java:25)
	at yamada3.cad_pedido$6.actionPerformed(cad_pedido.java:635)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2713)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:680)
	at java.awt.EventQueue$4.run(EventQueue.java:678)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

2 Respostas

ViniGodoy

Retire o comando rs.first(), ele não só não é necessário, como só é possível em resultsets que não são FORWARD_ONLY (o que não é seu caso).
Além disso, troque seu do…while por um while comum.

O ResultSet começa posicionado ANTES do primeiro registro, justamente para poder ser usado assim:

while (rs.next()) { //faz algo }

ViniGodoy

Outra coisa. O ideal é não fazer concatenação de Strings em consultas SQL.

Isso trás vários problemas:

  • Pessoas podem inserir valores inválidos, como por exemplo, valores que contenham aspas simples;
  • Pior que isso, um atacante poderia inserir uma QUERY, e detornar seu sistema.

Para resolver esse problema, use um PreparedStatement.

PreparedStatement stmt = con.prepareStatement("SELECT * FROM item_pedido WHERE id_pedido=?"); stmt.setInt(Integer.parseInt(id_pedido2)); ResultSet rs = stmt.executeQuery();

Outra coisa, por que id_pedido é uma String? Ids deveriam sempre ser valores numéricos.

Finalmente, vou mover seu tópico para o fórum de persistência. JDBC não é assunto de Java Básico.

Criado 23 de setembro de 2012
Ultima resposta 23 de set. de 2012
Respostas 2
Participantes 2