如何 return Java 中的结果集

How to return the Result Set in Java

我正在尝试 return 给定学生 ID 的结果集并显示 gpa。但是它说当结果集关闭时我无法执行操作。这是我的代码:

/**
 * Returns a ResultSet with a row containing the computed GPA (named as gpa) for a given student id.
 * You must use a PreparedStatement.
 * 
 * @return
 *       ResultSet containing computed GPA
 */
public ResultSet computeGPA(String studentId) throws SQLException
{
    ResultSet rst;

     // TODO: Use a PreparedStatement
    try(Connection con = connect()){

        String sql = "SELECT gpa FROM student WHERE sid=?";
        PreparedStatement pstmt = con.prepareStatement(sql);
        pstmt.setString(1, studentId);
        rst = pstmt.executeQuery();

        while(rst.next()){
            System.out.println(rst.getString("gpa"));
        }
    }
    return rst;
}

这是我得到的结果

Connecting to database. 2.96 Exception in thread "main" java.sql.SQLException: Operation not allowed after ResultSet closed at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:804) at com.mysql.jdbc.ResultSetImpl.getMetaData(ResultSetImpl.java:3107) at EnrollJDBC.resultSetToString(EnrollJDBC.java:500) at EnrollJDBC.main(EnrollJDBC.java:59)

您使用 try-with-resources,它会在您的 try 块完成时关闭 Connection。在 Java 中,当您关闭 Connection 时,您也会自动关闭与该连接关联的所有 ResultSet 对象。这就是异常告诉你的。您正在尝试使用关闭 ResultSet。因此,您需要更改代码以仅在完全处理 ResultSet 时关闭连接。

由于您通过 id 执行 SELECT,您会得到一条记录或没有记录。那么为什么不 return 只有存在的值或 null (或空字符串)如果不存在具有此类 ID 的学生而不是 returning ResultSet 对象computeGPA() 方法?

当(准备好的)语句关闭时,它的结果集也会关闭。 这是可以理解的,因为 ResultSet 很重 class,包含元数据和所有内容。

Return 更具体的列表。

public List<String> computeGPA(String studentId) throws SQLException {
    String sql = "SELECT gpa FROM student WHERE sid=?";
    try (Connection con = connect();
            PreparedStatement pstmt = con.prepareStatement(sql)) {
        pstmt.setString(1, studentId);
        try (ResultSet rst = pstmt.executeQuery()) {
            List<String> gpas = new ArrayList<>();
            while (rst.next()) {
                gpas.add(rst.getString(1));
            }
            return gpas;
        }
    }
}

第二个 try-with-resources 如前所述是正式不需要的,但代码检查器会注意到 ResultSet 是可自动关闭的,并且可能会给出误报警告。

您不能return ResultSet,因为它会在方法销毁时关闭。但是你可以从 ResultSet 中获取原始数据,试试这个:

public ArrayList<Byte[]> getResultQuery(String query){
    ArrayList<Byte[]> arrayList = new ArrayList<>();
    Byte[] row;
    conn = getConnection(db_url);
    try {
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(query);
        int countColumn = resultSet.getMetaData().getColumnCount();
        if (countColumn==0) return null;
        while (resultSet.next()){
            row = new Byte[countColumn];
            for (int i = 0; i<countColumn; i++){
                row[i] = resultSet.getByte(i+1);
            }
            arrayList.add(row);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return arrayList;
}

public static Connection getConnection (String db_url){
    Connection conn = null;
    try{
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        conn = DriverManager.getConnection(db_url);
    }catch(Exception e){
        e.printStackTrace();
    }
    return conn;
}

在此,我尝试 return ArrayList of Byte[],1 Byte[] = ResultSet 中的 1 行。如果你想获得一些值,只需将 Byte[i] 转换为你想要的数据类型!