2016-08-08 43 views
1

Ich versuche, eine Scheckdruckanwendung zu erstellen, in der ich vier ComboBoxen habe. Alle von ihnen erhalten Daten aus der Oracle-Datenbank. ComboBox1 ruft die Namen aller Banken ab, während ComboBox2 alle Konten der ausgewählten Bank abruft. ComboBox3 ruft alle from_cheque-Nummern des Bereichs ab und der letzte ruft alle to_cheque-Nummern des Bereichs ab.
Jetzt ist das Problem, wenn ich die Konto Nr. Auswähle. Es gibt eine Ausnahme ausgelöst "java.sql.SQLException: Closed Resultset: next" und es bringt nur eine Zeile in der ComboBox3, während mehr als eine Zeile in der Datenbank gespeichert sind und kein Ergebnis in der letzten ComboBox bringen. Der Code ist nachstehend aufgeführt.java.sql.SQLException: Closed Resultset: nächstes auf Element aus 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     
} 

Hier ist der Stack Trace.

Lauf: Verbindung erfolgreich java.sql.SQLException: Geschlossen Resultset: als nächstes bei oracle.jdbc.driver.InsensitiveScrollableResultSet.next (InsensitiveScrollableResultSet.java:558) bei frame.print_cheque.jComboBox2ActionPerformed (print_cheque. java: 262) bei frame.print_cheque.access $ 100 (print_cheque.java:23) um frame.print_cheque $ 2.actionPerformed (print_cheque.java:103) um javax.swing.JComboBox.fireActionEvent (JComboBox.java:1260) unter javax.swing.JComboBox.setSelectedItem (JComboBox.java:588) unter javax.swing.JComboBox.setSelectedIndex (JCom boBox.java:624) bei javax.swing.plaf.basic.BasicComboBoxUI.selectNextPossibleValue (BasicComboBoxUI.java:1124) bei javax.swing.plaf.basic.BasicComboBoxUI $ Actions.actionPerformed (BasicComboBoxUI.java:1528) bei javax.swing.SwingUtilities.notifyAction (SwingUtilities.java:1662) bei javax.swing.JComponent.processKeyBinding (JComponent.java:2879) bei javax.swing.JComboBox.processKeyBinding (JComboBox.java:1425) bei javax .swing.JComponent.processKeyBindings (JComponent.java:2940) um javax.swing.JComponent.processKeyEvent (JComponent.java:2842) um javax.swing.JComboBox.processKeyEvent (JComboBox.java:1417) um java.awt .Component.processEvent (Component.java:6293) unter java.awt.Container.processEvent (Container.java:2229) um java.awt.Component.dispatchEventImpl (Component.java:4872) um java.awt.Container.dispatchEventImpl (Container.java:2287) um java .awt.Component.dispatchEvent (Component.java:4698) bei java.awt.KeyboardFocusManager.redispatchEvent (KeyboardFocusManager.java:1887) bei java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent (DefaultKeyboardFocusManager.java:762) bei Java .awt.DefaultKeyboardFocusManager.preDispatchKeyEvent (DefaultKeyboardFocusManager.java:1027) um java.awt.DefaultKeyboardFocusManager.typeAheadAssertions (DefaultKeyboardFocusManager.java:899) um java.awt.DefaultKeyboardFocusManager.dispatchEvent (DefaultKeyboardFocusManager.java:727) bei java.awt.Component.dispatchEventImpl (Component.java:4742) bei java.awt.Container.dispatchEventImpl (Container.java:2287) bei Java .awt.Window.dispatchEventImpl (Window.java:2719) um java.awt.Component.dispatchEvent (Component.java:4698) um ​​ java.awt.EventQueue.dispatchEventImpl (EventQueue.java:747) um java.awt .EventQueue.access $ 300 (EventQueue.java:103) um java.awt.EventQueue $ 3.run (EventQueue.java:706) um java.awt.EventQueue $ 3.run (EventQueue.java: 704) bei java.security.AccessController.doPrivileged (native Methode) bei java.security.ProtectionDomain $ 1.doIntersectionPrivilege (ProtectionDomain.java:76) bei java.security.ProtectionDomain $ 1.doIntersectionPrivilege (ProtectionDomain.java: 87) bei java.awt.EventQueue $ 4.run (EventQueue.java:720) um java.awt.EventQueue $ 4.run (EventQueue.java: 718) um ​​ java.security.AccessController.doPrivileged (Native Methode) um java.security.ProtectionDomain $ 1.doIntersectionPrivilege (ProtectionDomain.java:76) bei java.awt.EventQueue.dispatchEvent (EventQueue.java:717) bei java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:242) bei java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:161) bei java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:150) bei java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:146) bei java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:138) bei java.awt.EventDispatchThread.run (EventDispatchThread.java:91)

+0

ich im Debug-Modus empfiehlt ausgeführt wird, und einen Haltepunkt einstellen bei 'while (rs3.next()) {' und sehen, was von jeder Anweisung in der Schleife zurückkommt. Dies kann auf das Problem hinweisen. – jr593

+0

Es kann nicht verwandt sein, aber Ihre nahen Sequenzen sind falsch, Sie sollen zuerst die Ergebnismenge schließen, dann die Anweisung und schließlich die Verbindung, wenn sie nicht mehr benötigt wird. Mit anderen Worten, die Close-Sequenz muss die invertierte Erstellungssequenz –

+0

haben. Fügen Sie die Stapel-Trace zu Ihrer Frage hinzu –

Antwort

3

Ihr Fehler ist hier:

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

Sie schließen ResultSet in der while-Schleife anstelle von außerhalb der Schleife

NB: Ihre Nähe Sequenzen sind falsch Sie zuerst die Ergebnismenge schließen sollen, dann die Erklärung und schließlich die Verbindung, wenn nicht mehr benötigt. Mit anderen Worten, die Close-Sequenz muss die invertierte Create-Sequenz haben.

Der Code sollte eher so etwas sein:

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(); 
    } 
} 

Unter der Annahme, dass Sie Java 7 oder höher, könnten Sie

mit der try-with-resources Anweisung betrachten