关闭preparedStatement时,Resultset为空

时间:2017-05-02 16:51:08

标签: java jdbc resultset

我有这样一种方法:

private static ResultSet select (Connection connection, String query) {
        PreparedStatement selectQuery = null;
        ResultSet resultSet = null;
        try {
            selectQuery = connection.prepareStatement(query);
            resultSet = selectQuery.executeQuery();
            selectQuery.close();
        } catch (SQLException e) {
            System.out.println(e);
        }
        return resultSet;
    }

当我关闭preparedStatement时,resultSet始终为空。 如果我用衣服readymentment //selectQuery.close();注释掉这一行,一切都很好。 在为resultSet赋值后,我将其关闭。那为什么它是空的?

4 个答案:

答案 0 :(得分:1)

ResultSet与已执行的Statement相关联。关闭语句和结果集,清除其中的任何数据。

您需要在关闭语句之前处理结果集,因此您的方法将无效。

答案 1 :(得分:1)

因为javadoc这样说:

  

注意:当Statement对象关闭时,其当前ResultSet object(如果存在)也将关闭。

理由:Statement.close()所述的行为是释放所有资源。其中一个资源是用于读取结果的服务器端游标。但是如果你释放它,那么ResultSet没有任何东西可以从中获取数据。

我很好奇你是如何确定(已关闭的)ResultSet是"空的"。看起来关闭ResultSet上的所有操作(除了close())都应该抛出异常。

答案 2 :(得分:1)

在检索结果集的数据之前,您不必关闭语句,否则这些可能无法访问 调用此方法时,其ResultSet对象将关闭。

因此,只有在使用完Statement后,才能调用Statement.close()方法。

收盘应在最终声明中执行 通过这种方式,您可以确保不必担心何时关闭它。

使用您的实际代码:

private static ResultSet select (Connection connection, String query) {
        PreparedStatement selectQuery = null;
        ResultSet resultSet = null;
        try {
            selectQuery = connection.prepareStatement(query);
            resultSet = selectQuery.executeQuery();
        } catch (SQLException e) {
            System.out.println(e);
        }
        finally {
           if (selectQuery != null) { selectQuery.close(); }
        }
        return resultSet;
    }    
} 

更好的选择是使用try-with-resources语句:

try (Statement stmt = con.createStatement()) {
    // ...
}

答案 3 :(得分:1)

您必须遍历ResultSet。你有一个高级别的例子:

try{ 
  // execute the query
  ResultSet rs = st.executeQuery(query);

  // iterate through the result set
  while (rs.next())
  {
    // Replace with your data
    int id = rs.getInt("id");
    String name = rs.getString("name");

    // do stuff with the result set, add to a List of objects (for example)
  }
  selectQuery.close();
}catch(SQLException e) {
        System.out.println(e);
}