我正在尝试创建一个支票打印应用程序,其中我有四个ComboBox。所有这些都是从oracle数据库获取数据。 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
}
这是Stack Trace。
运行:连接成功java.sql.SQLException:关闭结果集: 接下来 oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:558) 在 frame.print_cheque.jComboBox2ActionPerformed(print_cheque.java:262) at frame.print_cheque.access $ 100(print_cheque.java:23)at frame.print_cheque $ 2.actionPerformed(print_cheque.java:103)at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1260)at javax.swing.JComboBox.setSelectedItem(JComboBox.java:588)at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:624)at javax.swing.plaf.basic.BasicComboBoxUI.selectNextPossibleValue(BasicComboBoxUI.java:1124) 在 javax.swing.plaf.basic.BasicComboBoxUI中的$ Actions.actionPerformed(BasicComboBoxUI.java:1528) 在javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1662) 在javax.swing.JComponent.processKeyBinding(JComponent.java:2879)at javax.swing.JComboBox.processKeyBinding(JComboBox.java:1425)at javax.swing.JComponent.processKeyBindings(JComponent.java:2940)at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)at javax.swing.JComboBox.processKeyEvent(JComboBox.java:1417)at java.awt.Component.processEvent(Component.java:6293)at java.awt.Container.processEvent(Container.java:2229)at java.awt.Component.dispatchEventImpl(Component.java:4872)at java.awt.Container.dispatchEventImpl(Container.java:2287)at java.awt.Component.dispatchEvent(Component.java:4698)at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1887) 在 java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:762) 在 java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1027) 在 java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:899) 在 java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:727) 在java.awt.Component.dispatchEventImpl(Component.java:4742)at java.awt.Container.dispatchEventImpl(Container.java:2287)at java.awt.Window.dispatchEventImpl(Window.java:2719)at java.awt.Component.dispatchEvent(Component.java:4698)at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:747)at at java.awt.EventQueue.access $ 300(EventQueue.java:103)at java.awt.EventQueue $ 3.run(EventQueue.java:706)at java.awt.EventQueue $ 3.run(EventQueue.java:704)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:87) 在java.awt.EventQueue $ 4.run(EventQueue.java:720)at java.awt.EventQueue $ 4.run(EventQueue.java:718)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:76) 在java.awt.EventQueue.dispatchEvent(EventQueue.java:717)at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
答案 0 :(得分:3)
你的错误在这里:
while (rs3.next()) {
...
st2.close();
rs3.close();
}
您在while循环中关闭ResultSet
而不是在循环外
NB:您的关闭序列不正确您应该首先关闭结果集,然后关闭语句,最后关闭连接(如果不再需要)。换句话说,关闭序列必须是反转的创建序列。
你的代码应该是这样的:
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();
}
}
假设您使用的是Java 7或更高版本,可以考虑使用try-with-resources
语句