java.sql.SQLException: Closed Resultset: следующий при выборе элемента из ComboBox

Я пытаюсь создать приложение для печати чеков, в котором у меня есть четыре ComboBox. Все они получают данные из базы данных оракула. ComboBox1 извлекает названия всех банков, а ComboBox2 извлекает все счета выбранного банка. ComboBox3 получает все числа from_cheque диапазона, а последний - все числа to_cheque диапазона.
Теперь проблема в том, что когда я выбираю номер учетной записи. возникает исключение «java.sql.SQLException: Closed Resultset: next», и оно приносит только одну строку в ComboBox3, в то время как в базе данных хранится более одной строки, и не приносит никакого результата в последнем ComboBox. Код указан ниже.

package frame;

import java.beans.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import javax.swing.*;
import java.io.*;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author talha
 */
public class print_cheque extends javax.swing.JFrame {

    Connection con = null;
    java.sql.Statement st = null;
    java.sql.Statement st1 = null;
    java.sql.Statement st2 = null;
    java.sql.Statement st3 = null;

    /**
     * Creates new form print_cheque
     */
    public print_cheque() {
        initComponents();

        //Statement st =  null;
        String query = "Select bnk_nm from d_bank_mst";

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection("jdbc:oracle:thin:@191.1.1.220:1521:abc10g", "payablek", "payablek");
            System.out.println("connection successful");

            st = con.createStatement();
            ResultSet rs = st.executeQuery(query);
            int itemCount = jComboBox1.getItemCount();
            jComboBox1.addItem("--Select Company--");
            for (int i = 0; i < itemCount; i++) {
                jComboBox1.removeItemAt(0);
            }

            while (rs.next()) {
                String bank = rs.getString(1);
                jComboBox1.addItem(bank);
            }

            //JOptionPane.showMessageDialog(this, i);
            //con.close();
            st.close();
            rs.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, e);
        }

    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jComboBox1 = new javax.swing.JComboBox<>();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jComboBox2 = new javax.swing.JComboBox<>();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jComboBox4 = new javax.swing.JComboBox<>();
        jComboBox6 = new javax.swing.JComboBox<>();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jComboBox1.setToolTipText("");
        jComboBox1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBox1ActionPerformed(evt);
            }
        });

        jLabel1.setText("Bank Name");

        jLabel2.setText("Account No");

        jComboBox2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBox2ActionPerformed(evt);
            }
        });

        jLabel3.setText("From Cheque No");

        jLabel4.setText("To Cheque No");

        jRadioButton1.setText("Cash");
        jRadioButton1.addActionListener(new java.awt.event.ActionListener() {


    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        //JOptionPane.showConfirmDialog(null, "ello");       // TODO add your handling code here:
        JComboBox cb = (JComboBox) evt.getSource();
        int itemCount = jComboBox2.getItemCount();
        String banknm = (String) cb.getSelectedItem();// = "'%Sindh Bank Ltd%'";
        JOptionPane.showMessageDialog(null, banknm);
        jComboBox2.addItem("--Select Account--");
        try {
            st1 = con.createStatement();
        } catch (Exception ex) {
            Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
        }

        JOptionPane.showMessageDialog(null, 1);
        ResultSet rs2 = null;

        String query2 = "Select distinct c.ac_no  "
                + "from d_chq_mst c, d_bank_mst d "
                + "where d.bnk_nm like '%" + banknm + "%'"
                + "and  c.bnk_cd= d.bnk_cd ";//" + banknm + "
        try {
            JOptionPane.showMessageDialog(null, 2);
            //int itemCount = jComboBox2.getItemCount();
            for (int i = 0; i < itemCount; i++) {
                jComboBox2.removeItemAt(1);
            }
            rs2 = st1.executeQuery(query2);
            JOptionPane.showMessageDialog(null, 3);
            while (rs2.next()) {
                try {
                    //JOptionPane.showMessageDialog(null, 4);
                    jComboBox2.addItem(rs2.getString(1));
                } catch (SQLException ex) {
                    Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            st1.close();
            rs2.close();
        } catch (SQLException ex) {
            Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
        }

    }                                          

    private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                              
        // TODO add your handling code here:
    }                                             

    private void jComboBox2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        //int t = 0;
        JComboBox cb1 = (JComboBox) evt.getSource();
        jComboBox4.addItem("--Select From Cheque Number--");
        String acnt = (String) cb1.getSelectedItem();
        /*if((t == 0)&&!(jComboBox2.equals(null)) ){
            cb1.setSelectedItem(null);
        }*/

        JOptionPane.showMessageDialog(null, acnt);

        try {
            st2 = con.createStatement();
        } catch (Exception ex) {
            //Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        }
        ResultSet rs3 = null;
        String query3 = "select distinct d.chq_from "
                + "from d_chq_mst d, d_chq_dtl e  "
                + " where e.ac_no= '" + acnt + "'"
                + " and d.ac_no = e.ac_no ";
        try {
            rs3 = st2.executeQuery(query3);
            int itemCount2 = jComboBox4.getItemCount();
            /*for (int i = 0; i < itemCount2; i++) {
                //jComboBox4.removeItemAt(0);
                JOptionPane.showMessageDialog(this, i);
            }*/
            while (rs3.next()) {
                try {
                    JOptionPane.showMessageDialog(null, "item Count**" + itemCount2);
                    jComboBox4.addItem(rs3.getString(1));
                } catch (SQLException ex) {
                    //Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
                    ex.printStackTrace();
                }

                st2.close();
                rs3.close();

            }
        } catch (Exception ex) {
            //Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        }
        //t++;

    }                                          

    private void jComboBox4ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        jComboBox6.addItem("--Select To Cheque Number--");
        JComboBox cb2 = (JComboBox) evt.getSource();

        String account = (String) cb2.getSelectedItem();

        //JOptionPane.showMessageDialog(null, acnt);
        try {
            st3 = con.createStatement();
        } catch (Exception ex) {
            //Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        }
        ResultSet rs4 = null;
        String query3 = "select distinct d.chq_to  "
                + "from d_chq_mst d, d_chq_dtl e  "
                + "where d.ac_no= '" + account + "'"
                + "and d.ac_no= '" + account + "'";

        //+ "where d.ac_no = '" + acnt + "'";
        try {
            rs4 = st3.executeQuery(query3);
            int itemCount3 = jComboBox6.getItemCount();
            /*for (int i = 0; i < itemCount3; i++) {
                jComboBox6.removeItemAt(0);
            }*/
            while (rs4.next()) {
                try {
                    JOptionPane.showMessageDialog(null, rs4.getString(1));
                    jComboBox6.addItem(rs4.getString(1));
                } catch (SQLException ex) {
                    Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
                    ex.printStackTrace();
                }

                st3.close();
                rs4.close();

            }

        } catch (Exception ex) {
            //Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        }
    }                                          

    private void jComboBox6ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
    } 
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(print_cheque.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(print_cheque.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(print_cheque.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(print_cheque.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new print_cheque().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JComboBox<String> jComboBox1;
    private javax.swing.JComboBox<String> jComboBox2;
    private javax.swing.JComboBox<String> jComboBox4;
    private javax.swing.JComboBox<String> jComboBox6;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JRadioButton jRadioButton1;
    // End of variables declaration                   
}

Вот трассировка стека.

Ваша ошибка здесь:


person Ahmed Talha    schedule 08.08.2016    source источник
comment
Это может не быть связано, но ваши близкие последовательности неверны, вы должны сначала закрыть набор результатов, затем оператор и, наконец, соединение, если оно больше не нужно. Другими словами, последовательность закрытия должна быть инвертированной последовательностью создания.   -  person jr593    schedule 08.08.2016
comment
пожалуйста, добавьте трассировку стека к вашему вопросу   -  person Nicolas Filotto    schedule 08.08.2016
comment
rs3 не получает никаких данных и дает нулевой результат. Запрос, который я выполняю, отлично работает в разработчике plsql, а также в команде выполнения сетевых компонентов.   -  person Nicolas Filotto    schedule 08.08.2016
comment
@NicolasFilotto, пожалуйста, проверьте правки.   -  person Ahmed Talha    schedule 08.08.2016
comment
run: соединение выполнено успешно java.sql.SQLException: Closed Resultset: следующий в oracle.jdbc.driver.InsensitiveScrollableResultSet.next (InsensitiveScrollableResultSet.java:558) в frame.print_cheque.jComboBox2ActionPerformed (print_cheque.java) $ 100 (print_cheque.java:23) в frame.print_cheque $ 2.actionPerformed (print_cheque.java:103) в javax.swing.JComboBox.fireActionEvent (JComboBox.java:1260) в javax.swing.JComboBox.setSelectedItem (JavaComboBox.setSelectedItem (JavaComboBox. 588) на javax.swing.JComboBox.setSelectedIndex (JComboBox.java:624) в javax.swing.plaf.basic.BasicComboBoxUI.selectNextPossibleValue (BasicComboBoxUI.java:1124) в javax.swing.plicaction. (BasicComboBoxUI.java:1528) в javax.swing.SwingUtilities.notifyAction (SwingUtilities.java:1662) в javax.swing.JComponent.processKeyBinding (JComponent.java:2879) в javax.swing.JComboBox.processJavaKeyBox. 1425) на javax.s wing.JComponent.processKeyBindings (JComponent.java:2940) в javax.swing.JComponent.processKeyEvent (JComponent.java:2842) в javax.swing.JComboBox.processKeyEvent (JComboBox.java:1417) в java.process.ComponentEvent (Component.java:6293) в java.awt.Container.processEvent (Container.java:2229) в java.awt.Component.dispatchEventImpl (Component.java:4872) в java.awt.Container.dispatchEventImpl (Container.java: 2287) в java.awt.Component.dispatchEvent (Component.java:4698) в java.awt.KeyboardFocusManager.redispatchEvent (KeyboardFocusManager.java:1887) в java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent (Defaultanager.java:FocusManager.dispatchKeyEvent (по умолчанию). awt.DefaultKeyboardFocusManager.preDispatchKeyEvent (DefaultKeyboardFocusManager.java:1027) по адресу java.awt.DefaultKeyboardFocusManager.typeAheadAssertions (DefaultKeyboardFocusManager.java:899) по адресу java.awt.DefaultKeyboard (DefaultKeyboard). в java.awt.Component.dispatchEventImpl (Component.java:4742) в java.awt.Container.dispatchEventImpl (Container.java:2287) в java.awt.Window.dispatchEventImpl (Window.java:2719) в java.awt. Component.dispatchEvent (Component.java:4698) в java.awt.EventQueue.dispatchEventImpl (EventQueue.java:747) в java.awt.EventQueue.access $ 300 (EventQueue.java:103) в java.awt.EventQueue $ 3.run (EventQueue.java:706) в java.awt.EventQueue $ 3.run (EventQueue.java:704) в java.security. AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (ProtectionDomain.java:76) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (ProtectionDomain.java:87) в java.awt.EventQueue $ 4. .java: 720) в java.awt.EventQueue $ 4.run (EventQueue.java:718) в java.security.AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (ProtectionDomain.java:76) в java.awt.EventQueue.dispatchEvent (EventQueue.java:717) в java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:242) в java.awt.EventDispatchThread.pumpEvents.javaTread.java.pumpEvents.java.java.pumpEvents.java.pumpEvents.java.pumpEvents. .pumpEventsForHierarchy (EventDispatchThread.java:150) в java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:146) в java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:138) в entDispatchThread.run (EventDispatchThread.java:91)   -  person Ahmed Talha    schedule 08.08.2016


Ответы (1)


Вы закрываете свой ResultSet в цикле while, а не вне цикла

while (rs3.next()) {
    ...
    st2.close();
    rs3.close();
}

NB: ваши близкие последовательности неверны, вы должны закрыть сначала набор результатов, затем оператор и, наконец, соединение, если оно больше не нужно. Другими словами, последовательность закрытия должна быть инвертированной последовательностью создания.

Ваш код должен быть примерно таким:

Предполагая, что вы используете Java 7 или выше, вы можете рассмотреть возможность использования оператора try-with-resources

try {
    ...
} catch (Exception ex) {
    //Logger.getLogger(print_cheque.class.getName()).log(Level.SEVERE, null, ex);
    ex.printStackTrace();
} finally {
    // Close first the result set
    if (rs4 != null) {
        rs4.close();  
    }
    // The close your statement
    if (st3 != null) {
        st3.close(); 
    } 
}

Я предлагаю запустить в режиме отладки и установить точку останова на

while (rs3.next()) {
    ...
    st2.close();
    rs3.close();
}
и посмотреть, что возвращается из каждого оператора в цикле. Это может указывать на проблему.

person Nicolas Filotto    schedule 08.08.2016