您的位置:首页 > 运维架构

operation not allowed after resultset closed错误的解决

2016-04-30 18:44 316 查看

就我目前碰到的过的,主要有两种情况会产生这样的问题,一个就是在百度里被转来转去的答案:

一个stmt多个rs进行操作.那么从stmt得到的rs1,必须马上操作此rs1后,才能去得到另外的rs2,再对rs2操作.

不能互相交替使用,会引起rs已经关闭错误.错误的代码如下:

stmt=conn.createStatement(); 

rs=stmt.executeQuery("select

* fromt1"); 

rst=stmt.executeQuery("select

* from t2");

rs.last();//由于执行了rst=stmt.executeQuery(sql_a);rs就会被关闭掉!所以程序执行到此会提示ResultSet已经关闭.

错误信息为:java.sql.SQLException:Operation

not allowed after ResultSet closed rst.last();

正确的代码:

stmt=conn.createStatement(); 

rs=stmt.executeQuery("select

* fromt1"); 

rs.last();//对rs的操作应马上操作,操作完后再从数据库得到rst,再对rst操作

rst=stmt.executeQuery("select

* from t2");

rst.last();

说的大概意思就是在同一时刻每个Statement对象只能有一个ResultSet对象可以打开,当程序执行执行了rst=stmt.executeQuery(sql_a);rs就会被关闭掉!

关掉了还在上面进行操作的话肯定会有错误的。解决方法就是不在同一时刻打开多个ResultSet对象,打开一个操作一个。

还有一个问题就是诸如:

stmt=conn.createStatement();

sql=

"SELECT LAST_INSERT_ID()from"+tableName;

rs

=stmt.executeQuery(sql);

while(rs.next()){

 sql

= "update "+tableName+" set notifyURL='"+URLUtil.getRequestServerContext(request) +"/NotifyAction?id="+rs.getInt(1)+"' where id ="+rs.getInt(1);

   stmt.executeUpdate(sql);

}

目前网上的方法有很多以讹传讹的,比如在while循环外关闭rs,这是解决不了问题的。问题错的地方并不是rs关闭的时机,而是因为

每执行一次execute操作rs就会被自动地关闭。对一个已经关闭的rs再执行next显然是错误的。解决的方法就是在while循环内添加以下一句

代码:

stmt=conn.createStatement();

在每次用到stmt的时候都创建一个新的Statement对象。这样就不会重复的使用rs了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: