如何在Java中返回结果集
我正在尝试返回给定学生id的结果集并显示gpa。然而,它说当结果集关闭时,我无法执行该操作。这是我的代码:如何在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
/**
* 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)
对于其他情况。