2011-02-12 37 views
1

我的代碼工作正常,但我得到這個例外了很多,這是造成一點點的滯後......我懷疑這部分產生的異常獲取值java.sql.SQLException:不允許操作的ResultSet關閉

try { 
     try { 
      rs = dbConnection.getStatement().executeQuery("SELECT * FROM healthgym.member WHERE member_id = " + id); 
      rs.next(); 
     } catch (SQLException ex) { 
      Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     m.setMember_id(rs.getInt("member_id")); 
     m.setRec_id(rs.getInt("rec_id")); 
     m.setTrainer_id(rs.getInt("trainer_id")); 
     m.setFname(rs.getString("fname")); 
     m.setLname(rs.getString("lname")); 
     m.setMname(rs.getString("mname")); 
     m.setEmail(rs.getString("email")); 
     m.setPhoneNo(rs.getInt("phoneno")); 
     m.setAge(rs.getInt("age"));............ 

我稍後使用m對象來填充一些文本字段

編輯1:我仍然得到那個異常......這是什麼發生......我在Jtable中選擇一行,然後按編輯按鈕拋出異常,但它工作正常 這裏是所謂的當我按編輯對接在

private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
    int id = ((Number) model.getValueAt(jTable1.getSelectedRow(), 0)).intValue() ; 
    System.out.println(id); 

     m = new Member(); 
    c.getMember(m,id); 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new EditMember(c,model,m).setVisible(true); 
     } 
    }); 


}  

而且EditMember是一個GUI下面是它的構造..

public class EditMember extends javax.swing.JFrame { 

/** Creates new form EditMember */ 
public EditMember(Controller c, ResultSetTableModel model , Member m) { 

    initComponents(); 
    this.c = c; 
    this.model = model ; 
    this.m = m ; 
    memberID.setText(Integer.toString(m.getMember_id())); 
    recID.setText(Integer.toString(m.getRec_id())); 
    trainerID.setText(Integer.toString(m.getTrainer_id())); 
    fName.setText(m.getFname()); 
    lName.setText(m.getLname());....... 

編輯2:

那; S在異常情況發生:

public Object getValueAt(int row, int column) 
    throws IllegalStateException 


    { 
     // ensure database connection is available 
     if (!dbConnection.isConnectedToDatabase()) 
     throw new IllegalStateException("Not Connected to Database"); 
    // obtain a value at specified ResultSet row and column 

    try 
    { 
    resultSet.absolute(row + 1); 
    return resultSet.getObject(column + 1); 
    } // end try 
    catch (SQLException sqlException) 
    { 
     System.out.println("Exception from here dude"); 
    sqlException.printStackTrace(); 
    } // end catch 

我猜問題是因爲我使用了之前用來構造JTable的結果集。

+0

你從哪裏得到例外? ResultSet在哪裏關閉? rs是在哪裏申報的?它是否在線程之間共享(壞主意)? – 2011-02-12 10:24:50

+0

我指定了哪裏...... rs在具有getMember方法的類中聲明。不,它不共享。 – Ahmed 2011-02-12 10:53:57

回答

3

應該

if(rs.next(){ 
    m.setMember_id(rs.getInt("member_id")); 
} 

因此,所有設定值將在try塊。

爲什麼你會收到錯誤? 因爲有時候結果爲空時,結果集將被rs.next()關閉。

如果你把它放在while {在查詢結果中有多行的地方}或者如果你只接受一行查詢輸出}。

0
try { 
    Statement stmt = dbConnection.createStatement(); 
    ResultSet rs = stmt.executeQuery 
    ("SELECT * FROM healthgym.member WHERE member_id = " + id); 

    // Fetch each row from the result set 
    while (rs.next()) { 
     // Get the data from the row using the column index 
     m.setMember_id(rs.getInt("member_id")); 
     m.setRec_id(rs.getInt("rec_id")); 
     m.setTrainer_id(rs.getInt("trainer_id")); 
     m.setFname(rs.getString("fname")); 
     m.setLname(rs.getString("lname")); 
     m.setMname(rs.getString("mname")); 
     m.setEmail(rs.getString("email")); 
     m.setPhoneNo(rs.getInt("phoneno")); 
     m.setAge(rs.getInt("age")); 
    } 
} catch (SQLException e) { 
} 

試試這種方法。

相關問題