Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中返回结果集_Java_Mysql_Database_Resultset - Fatal编程技术网

如何在Java中返回结果集

如何在Java中返回结果集,java,mysql,database,resultset,Java,Mysql,Database,Resultset,我正在尝试返回给定学生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

我正在尝试返回给定学生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;
}
这就是我得到的结果

连接到数据库。 线程“main”java.sql.SQLException中的2.96异常:在关闭ResultSet后不允许操作 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)位于 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)位于 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)位于 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)位于 com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:804)位于 com.mysql.jdbc.ResultSetImpl.getMetaData(ResultSetImpl.java:3107)位于 EnrollJDBC.resultSetToString(EnrollJDBC.java:500)位于 EnrollJDBC.main(EnrollJDBC.java:59)


try
块完成时,您可以使用
try with resources
关闭
Connection
。在Java中,当您关闭
连接时
还会自动关闭与该连接关联的所有
结果集
对象。这就是例外告诉你的。您正在尝试使用关闭的
结果集
。因此,只有当
ResultSet
被完全处理时,您才需要将代码更改为关闭连接


由于您按id执行
选择
,因此会得到一条记录或没有记录。因此,为什么不只返回存在的值,或者如果不存在具有该id的学生,则返回该值(或空字符串),而不是从
computeGPA()
方法返回
ResultSet
对象?

您使用
try with resources
try
块完成时关闭
连接。在Java中,当您关闭
连接时
还会自动关闭与该连接关联的所有
结果集
对象。这就是例外告诉你的。您正在尝试使用关闭的
结果集
。因此,只有当
ResultSet
被完全处理时,您才需要将代码更改为关闭连接

由于您按id执行
选择
,因此会得到一条记录或没有记录。那么,为什么不只返回存在的值,或者如果不存在具有该id的学生,为什么不返回该值(或空字符串),而不是从
computeGPA()
方法返回
ResultSet
对象?

当(准备好的)语句关闭时,其结果集也将关闭。 这是可以理解的,因为ResultSet是一个沉重的类,包含元数据和所有内容

返回一个更具体的列表

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;
        }
    }
}
public List computeGPA(String studentId)抛出SQLException{
String sql=“从学生中选择gpa,其中sid=?”;
try(Connection con=connect();
PreparedStatement pstmt=con.prepareStatement(sql)){
pstmt设置管柱(1,学生ID);
try(ResultSet rst=pstmt.executeQuery()){
List gpas=new ArrayList();
while(rst.next()){
gpas.add(rst.getString(1));
}
返回GPA;
}
}
}
如前所述,正式不需要第二次尝试使用资源,但是代码检查器会注意到ResultSet是自动关闭的,并且可能会给出错误的肯定警告。

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

返回一个更具体的列表

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;
        }
    }
}
public List computeGPA(String studentId)抛出SQLException{
String sql=“从学生中选择gpa,其中sid=?”;
try(Connection con=connect();
PreparedStatement pstmt=con.prepareStatement(sql)){
pstmt设置管柱(1,学生ID);
try(ResultSet rst=pstmt.executeQuery()){
List gpas=new ArrayList();
while(rst.next()){
gpas.add(rst.getString(1));
}
返回GPA;
}
}
}

如前所述,正式不需要第二次尝试使用资源,但是代码检查器会注意到ResultSet是自动关闭的,并且可能会给出错误的肯定警告。

您不能返回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;
}
public ArrayList getResultQuery(字符串查询){
ArrayList ArrayList=新的ArrayList();
字节[]行;
conn=getConnection(db_url);
试一试{
语句Statement=conn.createStatement();
ResultSet ResultSet=statement.executeQuery(查询);
int countColumn=resultSet.getMetaData().getColumnCount();
if(countColumn==0)返回null;
while(resultSet.next()){
行=新字节[计数列];

对于(int i=0;i您无法返回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;
}
public ArrayList getResultQuery(字符串查询){
ArrayList ArrayList=新的ArrayList();
字节[]行;
conn=getConnection(db_url);
试一试{
语句Statement=conn.createStatement();
ResultSet ResultSet=statement.executeQuery(查询);
int countColumn=resultSet.getMetaData().getColumnCount();
if(countColumn==0)返回null;
while(resultSet.next()){
行=新字节[计数列];

对于(int i=0;iWell,如果行不是字符串而是不同类型的行,该怎么办?@Freddy i使用了OP的类型,并且ResultSet closed后不允许执行错误
操作
表明它们可能正常。
setLong(1,longId)
对于其他情况。那么,如果行不是字符串而是不同类型的行,那会怎么样?@Freddy我使用了OP的类型,并且在ResultSet关闭后不允许执行错误
操作
表明它们可能没问题。
setLong(1,longId)
对于其他情况。