[RESOLVIDO] Erro com SQL: java.sql.SQLException: Operation not allowed after ResultSet closed

Boa noite pessoal, esse é o meu 1º post, nao sei se ta no lugar certo mas ai vai:
Tenho em BD MySQL com 3 tabelas: vendas, produtos e vendaItens.
Quando eu vendo um produto, subtraio a quantidade vendida da qtd. do produto e gravo na tabela “vendaItens” o numero da venda, o cod. do produto e a quantidade vendida.

Estou fazendo agora o metodo para cancelar a venda, onde ele tem que excluir a venda da tabela “vendas” e escluir todos os registro relacionados a essa venda da tabela “vendaItens”, mas antes tenho que RETORNAR A QUANTIDADE DOS PRODUTOS e é aí q ta dando erro. :frowning:

Por favor, peço a ajuda do pessoal aq do forum.
Obrigado.

Código-fonte do método de cancelamento:

// ==================== CANCELAMENTO DA VENDA

                int codVenda = venda;
                java.sql.Date data = getDateSqlFormat();
                String sQuery;

//                Instancia a classe de conexao do DB
                db_connect DBconn = new db_connect();
//                Conecta o DB
                DBconn.connectDB(null, null, null);

                int retorno = 0;
//                retorno = DBconn.doUpdateNonReturnable(sQuery);



//                    Se excluir a venda do DB com sucesso:

                sQuery = "SELECT * FROM vendaitens WHERE vendaId=" + venda;

                System.out.println(sQuery);

                ResultSet rs = null;
                rs = DBconn.doQueryReturnable(sQuery);


                while (rs.next()) {

                    int itemCod = rs.getInt("vendaitens.itemCod");
//                            float qtdIte = rs.getFloat("vendaitens.qtdIte");
                    float qtdRetornar = rs.getFloat("vendaitens.qtdIte");
                    float qtdAtualPrdt = 0;

                    String ssQueryB = "SELECT qtdAtual FROM produtos WHERE codigo=" + itemCod;
                    System.out.println(ssQueryB);
                    ResultSet res2 = DBconn.doQueryReturnable(ssQueryB);
                    if (res2.next()) {
                        qtdAtualPrdt = res2.getFloat("produtos.qtdAtual");
                    }

                    float novaQtdPrdt = qtdAtualPrdt + qtdRetornar;

                    String queryC = "UPDATE produtos SET qtdAtual=" + novaQtdPrdt + " WHERE codigo=" + itemCod;
                    System.out.println(queryC);

                    DBconn.doUpdateNonReturnable(queryC);


                }

obs.: esqueci de colocar o erro: :smiley:

[code]Mai 31, 2012 9:32:38 PM frmCxa miCancelarVendaActionPerformed
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 frmCxa.cancelVenda(frmCxa.java:650)
at frmCxa.miCancelarVendaActionPerformed(frmCxa.java:415)
at frmCxa.access$500(frmCxa.java:20)
at frmCxa$6.actionPerformed(frmCxa.java:203)
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.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.AbstractButton.doClick(AbstractButton.java:356)
at javax.swing.plaf.basic.BasicMenuItemUI$Actions.actionPerformed(BasicMenuItemUI.java:802)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1661)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:689)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:697)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:697)
at javax.swing.JMenuBar.processKeyBinding(JMenuBar.java:668)
at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:306)
at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:292)
at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2971)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2963)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
at java.awt.Component.processEvent(Component.java:6282)
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.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1890)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:752)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1017)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:889)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:717)
at java.awt.Component.dispatchEventImpl(Component.java:4731)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
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)

CONSTRUÇÃO PARADA (tempo total: 26 segundos)
[/code]

Pelo que me parece você esta usando dois Resultsets com o mesmo Statement…

sim. isso não é possível??
vou tentar mudar isso =D

Isso… teste para ver se é esse o problema…

[quote]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.[/quote]

http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html

Mas vou ter q criar um statment para cada query? nao tem como eu gravar o meu rs e depois encerra-lo pq quem executa os querys e updates e outra class e o result set ta nela.
Então vou ter q criar os statments na minha classe de venda ao invés de fazer isso na classe de conexão do banco de dados
Estou usando servidor mySql do Wamp para testes

[quote=Higashi]Isso… teste para ver se é esse o problema…

[quote]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.[/quote]

http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html[/quote]

consegui coloquei na minha classe de conexão com o DB um metodo para criar um novo statement e chamo esse metodo toda vez que faço um query.
valeu pela ajuda Higashi =D