今天调用DbUtil类直接操作数据库,取得ResultSet,想判断其是否为空(sql中有exists判断有无相关记录),结果出现异常:
分析及解决:
在Statement建立时
使用的是默认参数(结果集类型为ResultSet.TYPE_FORWARD_ONLY),这种类型的结果集只能通过rs.next();方法逐条读取,使用其他读取方法时就会报错。如果需要执行一些其他或复杂的移动结果集指针的操作就要使用其它参数。
如,更改如下,可解决:
各参数介绍:
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更新数据库
- [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更新数据库