2016-03-14 35 views
0

我正在使用Prepared Statement進行我的SELECT查詢。之後,我試圖從ResultSet得到我的信息,並將其放入ArrayList。 我正在把它變成Result Set循環,但我得到一個錯誤java.sql.SQLException: Operation not allowed after ResultSet closed。 我試圖用rs.close()關閉它,但它給了我同樣的錯誤。這是我的方法。請幫助!SQLException:ResultSet關閉後不允許操作。 Java.Spring MVC

@SuppressWarnings("unchecked") 
@Override 
public List<Users> listUsersSort(Integer weight, String gender, String place, Integer ageTo, String currentUser) { 
    System.out.println(weight + gender + place + ageTo + currentUser); 
    Connection dbConnection = null; 
    PreparedStatement preparedStatement = null; 
    boolean weightFlag = false; 
    boolean genderFlag = false; 
    boolean placeFlag = false; 
    boolean ageToFlag = false; 
    int iterator = 0; 
    List<Users> usersList = new ArrayList<Users>(); 
    String selectSQL = "select*from users where users.enabled = ?"; 
    if (weight < 40 == false) { 
     String weightParam = " AND users.weight <= ?"; 
     selectSQL = selectSQL.concat(weightParam); 
     weightFlag = true; 
     System.out.println(selectSQL); 
    } 
    if (gender.isEmpty() == false) { 
     String genderParam = " AND users.gender LIKE ?"; 
     selectSQL = selectSQL.concat(genderParam); 
     genderFlag = true; 
    } 

    if (place.isEmpty() == false) { 
     String placeParam = " AND users.place LIKE ?"; 
     selectSQL = selectSQL.concat(placeParam); 
     placeFlag = true; 
     // query = query.concat(placeParam); 
    } 
    if (ageTo < 19 == false) { 
     String age = " AND users.age <= ?"; 
     selectSQL = selectSQL.concat(age); 
     ageToFlag = true; 
    } 
    String withoutUser = " AND users.username NOT LIKE ?"; 
    selectSQL = selectSQL.concat(withoutUser); 
    System.out.println("FINAL QUERY IS: " + selectSQL); 
    Connection con = getConnection(); 
    try { 

     preparedStatement = con.prepareStatement(selectSQL); 
     preparedStatement.setBoolean(++iterator, true); 
     if (weightFlag) 
      preparedStatement.setInt(++iterator, weight); 

     if (genderFlag) 
      preparedStatement.setString(++iterator, gender); 

     if (placeFlag) 
      preparedStatement.setString(++iterator, place); 

     if (ageToFlag) 
      preparedStatement.setInt(++iterator, ageTo); 

     preparedStatement.setString(++iterator, currentUser); 

    } catch (SQLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    ResultSet rs = null; 
    try { 
     rs = preparedStatement.executeQuery(); 
     con.close(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     Users userrs = new Users(); 
     while (rs.next()) {    
      userrs.setUsername(rs.getString("username")); 
      userrs.setName(rs.getString("name")); 
      userrs.setSurname(rs.getString("surname")); 
      userrs.setGender(rs.getString("gender")); 
      userrs.setWeight(rs.getInt("weight")); 
      userrs.setHeight(rs.getInt("height")); 
      userrs.setSport(rs.getString("sport")); 
      userrs.setSport(rs.getString("place")); 
      usersList.add(userrs); 

     } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 



    return usersList; 
} 

回答

1

關閉連接也會關閉準備好的語句。

您應該只在結束業務後使用結果集關閉連接。

您的代碼應該是這樣的:

Connection dbConnection=null; 
PreparedStatement preparedStatement=null; 
ResultSet rs = null; 
try { 
    dbConnection = getConnection(); 
    preparedStatement = dbConnection.preparedStatement(...); 

    ... bind variables to preparedStatement ... 

    rs = preparedStatement.executeQuery(); 

    ... work with result set ... 

} finally { 
    if (rs!=null) 
    rs.close(); 
    if (preparedStatement!=null) 
    preparedStatement.close(); 
    if (dbConnection!=null) 
    dbConnection.close(); 
} 

編輯:在Java7你可以這樣寫:

try (Connection dbConnection = getConnection(); 
    PreparedStatement preparedStatement = dbConnection.preparedStatement(...)) { 

    ... bind variables to preparedStatement ... 

    try (ResultSet rs = preparedStatement.executeQuery()) { 

    ... work with result set ... 
    } 
} 
+0

嗯,嘗試與 - 資源?最後沒有必要。 – Majora320

+0

你假設java7。我沒有看到任何跡象表明這是事實...... – Shloim

+0

I ** do **假設他正在使用Java 7,特別是因爲6正式在生命的盡頭。 – Majora320

相關問題