为什么在我的代码中关闭ResultSet后不允许操作?

时间:2015-08-12 14:20:48

标签: java jdbc

我得到了一个"在ResultSet关闭错误后不允许操作"对于下面的代码块。我正在为每个请求创建一个新的连接实例,并在finally块中关闭它们。

public int getUserIdBasedOnAlias(String alias){
    int i=0;
    ResultSet rs=null;
    java.sql.CallableStatement cstmt=null;
    DBHelper dbh=new DBHelper();
    java.sql.Connection con=dbh.getConnection();
    try{
        cstmt=con.prepareCall("{call sp_GetUserIdBasedOnAlias(?)}");
        cstmt.setString(1,alias);
        rs=cstmt.executeQuery();  
        while(rs.next()){  // *** ERROR IS HERE ***
                i=rs.getInt("UserId");                                               
        }

    }
    catch(SQLException e){
        e.printStackTrace();
    }
    finally{
        try {
            dbh.close(rs, cstmt, con);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return i;
}

以下是DBHelper类中的代码

public  Connection getConnection() {

    //Loading JDBC Driver Class
    try{
        Class.forName("com.mysql.jdbc.Driver");
    }
    catch (ClassNotFoundException e){
        e.printStackTrace();
    }
    try{
        con=DriverManager.getConnection(conUrl,userName,pwd);
    }
    catch (SQLException e){
        e.printStackTrace();
    }
    return con;
}



public void close(ResultSet rs, CallableStatement cstmt, Connection con) throws SQLException {
    try {
        try {
            if (rs!=null) rs.close();
        } finally {
            if (cstmt!=null) cstmt.close();
        }
    } finally {
        if (con!=null) con.close();
    }
}

堆栈追踪:

java.sql.SQLException: Operation not allowed after ResultSet closed
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
  at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:666)
  at com.mysql.jdbc.ResultSet.next(ResultSet.java:7274)
  at COM.FRMC.PKG.Employee.getUserIdBasedOnAlias(Employee.java:101)

程序声明:

Delimiter $$
Create Procedure sp_GetUserIdBasedOnAlias
(
in aliasname nvarchar(50)
)
Begin

Select 1 as UserId;
End$$
Delimiter ;

这是工作代码:

public int getUserIdBasedOnAlias(String alias) throws SQLException{
        int i=0;
        DBHelper dbh=new DBHelper();
        ResultSet rs=null;
        CallableStatement cstmt=null;
        java.sql.Connection con=dbh.getConnectionToFRMC_RiskAssessment();
        try{
            CallableStatement ct = con.prepareCall("{CALL sp_GetUserIdBasedOnAlias(?)}");
            ct.setString(1,alias);
            ct.execute();
            ResultSet rs1=ct.getResultSet();
            while(rs1.next()){
                i=rs1.getInt(1);
            }

        }
        catch(SQLException e){
            e.printStackTrace();
        }
        finally{
            try {
                dbh.close(rs, cstmt, con);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return i;
    }

0 个答案:

没有答案