我得到了一个"在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;
}