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了。
相关文章推荐
- linux编译中的常见问题
- 如何解决 arm-none-linux-gnueabi-gcc -v和arm-linux-gcc 没有那个文件或目录
- Hadoop RPC基本框架
- Linux如何卸载正在执行的挂载文件
- Centos中查看nginx、apache、php、mysql配置文件路径
- CentOS7系统如何修改主机名
- 各种Linux下的HugePage 大小
- Linux dpke apt-get
- Linux 安装ftp
- isapi_redirect.exe安装失败处理
- Linux rpm命令教程
- Linux Mint (应用软件:QT 5.X)
- 每天一个linux命令:iostat
- 解决Centos关闭You have new mail in /var/spool/mail/root提示
- Linux iostat监测IO状态
- linux下配置ip地址四种方法
- Linux系统VI命令操作文档
- libupnp的安装方法
- 正向解析区域、反向解析区域;主/从;子域;基本安全控制
- Linux 下安装jdk