当前位置: 首页 > 知识库问答 >
问题:

SQLException:结果集关闭后不允许操作。Java语言SpringMVC

锺离俊雄
2023-03-14

我正在使用Prepared语句进行我的SELECT查询。之后,我试图从结果集获取信息,并将其放入数组列表中。我正在将其放入结果集循环,但我得到了一个错误。sql。SQLException:结果集关闭后不允许操作。我试图用rs.close()关闭它,但它给了我同样的错误。这是我的方法。请帮忙!

    @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个答案

罗翔
2023-03-14

关闭连接也将关闭准备好的语句。

只有在使用结果集完成业务后才能关闭连接。

您的代码应如下所示:

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 ...
  }
}
 类似资料:
  • 我试图为通过html形式的文本框检索的查询编写一个JUnit测试。文本检索已经过测试并有效,但我的单元测试失败了。我使用了两个相关的类:QueryController和QueryControlllerTest。我一直在玩弄我在这两个类中关闭的时间和内容,并不断得到错误:结果集关闭后不允许操作。 QueryController测试。Java语言 QueryController。Java语言

  • 下面是相关的代码部分:Server. Proxy.update_allLogOut:(第65行是时括号) 服务器服务器: 主要: 我必须指出,它99%的运行时间都没有例外。。但有几次我遇到了这个例外,我不明白为什么会发生这种情况。有什么想法吗?很明显,有些地方做错了,但这里所有类似的主题都没有给出这个问题的答案。。。

  • 我是java和SQL新手,我在重复一个我不知道如何避免的问题: 假设我想创建两个执行查询,一个在getRequest estsFromDB方法中的另一个内部,我创建第一个执行查询,在第二个方法中,我创建第二个执行查询: 第二个功能: 在第二个循环中,我得到了一个SQLException:“ResultSet关闭后不允许操作”,我尝试了:最后用result关闭结果。close()但我也得到异常nul

  • 单击按钮时,此代码显示此错误消息: 结果集关闭后不允许操作 代码:

  • 我已经为此工作了将近一天半,我似乎无法解决这个错误。我不知道为什么结果集被关闭。也许你们中的一些人可以帮我。 MySQL数据库: MySQLHandler MySQLDonation 异常发生在这里:在MySQLDonation和实际堆栈跟踪的同时循环中: 有了这些信息,让我说这确实有效,我得到了我的信息和游戏中没有的东西,但它会重复,就像用户永远不会从查询中删除,所以它会给他们无限的奖励。如果您

  • 我目前正在使用MySQL for DB connection开发一个Struts2 Web应用程序,并且在实际工作中遇到了代码部分的问题。恒定误差: 我目前拥有的RequestAction类基本上是我的一个工作项目的完整副本,但由于某些原因,我无法使其用于此应用程序。 请求操作。Java: 不知道为什么连接不工作,我试图乱搞,看看从我的其他项目,看看有什么差异,使连接和无法找到它,除非是给问题。