欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

"对只转发结果集的无效操作: first" - 异常

程序员文章站 2022-03-16 11:58:51
...
今天调用DbUtil类直接操作数据库,取得ResultSet,想判断其是否为空(sql中有exists判断有无相关记录),结果出现异常:
[ERROR] 2009-03-19 11:04:44 [http-8080-1] com.utils.DbUtil.executeSql(DbUtil.java:57)
java.sql.SQLException: 对只转发结果集的无效操作: first
java.sql.SQLException: 对只转发结果集的无效操作: first
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.BaseResultSet.first(BaseResultSet.java:74)
	at com.mchange.v2.c3p0.impl.NewProxyResultSet.first(NewProxyResultSet.java:3420)
	at com.utils.DbUtil.executeSql(DbUtil.java:53)

分析及解决:
在Statement建立时
stmt = conn.createStatement();

使用的是默认参数(结果集类型为ResultSet.TYPE_FORWARD_ONLY),这种类型的结果集只能通过rs.next();方法逐条读取,使用其他读取方法时就会报错。如果需要执行一些其他或复杂的移动结果集指针的操作就要使用其它参数。
如,更改如下,可解决:
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

各参数介绍:
引用

  1. ResultSet.TYPE_FORWARD_ONLY   (默认方式,略)
   2. ResultSet.TYPE_SCROLL_INSENSITIVE  双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。
   3. ResultSet.TYPE_SCROLL_SENSITIVE  双向滚动,并及时跟踪数据库里的更新,以便更改ResultSet中的数据。
   4. ResultSet.CONCUR_READ_ONLY  只读取ResultSet
   5. ResultSet.CONCUR_UPDATABLE  用ResultSet更新数据库