99999 message :Invalid operation for forward only resultset : first

Java 代码 
java.sql.SQLException: Invalid operation for forward only resultset : isLast 

解决方法是: 

Java 代码 
PreparedStatement ps = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 

在网上搜到的资料如下: 
结果集:即使用 Statement 实例执行一个 SQL 语句之后得到的一个 ResulSet 的对象。其类型分为三种:基本结果集,可滚动结果集,可更新结果集。 

一、基本结果集 
1、特点:检索方法只有两种:ResultSet.next 和 getXXX 
2、Statement 语句对象创建方式: 
a.Statement 语句:createStatement() 
b.PreParedStatement 语句:PreparedcreateStatement(String sql) 
c.CallableStatement 语句:CallablecreateStatement(String sql) 
3、主要方法: a.boolean next() 方法 将游标移到下一行,如果是有效数据则返回 true, 注意查询语句返回的结果中游标的位置为第一行的前面。 
b.getXXX(int columnIndex) 方法 按列号返回当前行中指定列的值,并将其转换为方法中 XXX 所对应的 java 数据类型。 
c.getXXX(String columnName) 方法 按名返回当前行中指定列的值,并将其转换为方法中 XXX 所对应的 java 数据类型。 

二、可滚动结果集 
1、特点:检索方法:提供各种定位游标的方法自由地再结果集中滚动。弥补了基本结果集只能先前滚动的局限性。 
2 Statement 语句对象创建方式: 
a.Statement:createStatement(int resultSetType,int reslutSetConcurrency) 
b.PrepareStatement:prepareStatement(String sql,int resultSetType,int reslutSetConcurrency) 
c.CallableStatement:prepareCall(String sql,int resultSetType,int reslutSetConcurrency) 
常量 
含义描述 
TYPE_FORWARD_ONLY 
结果集不可滚动,相当于基本结果集。 
TYPE_SCROLL_INSENSITIVE 
结果集可滚动,但是当结果集处于打开状态时,对底层数据表中所作的变化不敏感。 
TYPE_SCROL_SENSITIVE 
结果集可滚动,并且当结果集处于打开状态时,对底层数据表中所作的变化敏感。 
CONCUR_READ_ONLY 
结果集不可更新,所以能够提供最大可能的并发级别。 
CONCUR_UPDATABLE 
结果集可更新,但只能提供受限的并发级别。 
3、主要方法: 
●boolean previous() 
●boolean first() 
●boolean last() 
●void beforFirst() 将游标移到第一行之前 
●void afterLast() 将游标移到最后一行之后 
●boolean relative(int rows) 相对于游标的当前位置将游标移动参数 rows 指定的行数,正数前负后。 
●boolean absolute(int row) 将游标移动到参数 row 指定的数据行 rows 为正从结果集的开始向前,负从结果集的末尾向后,为零移到第一行之前。 
判断游标当前位置的方法“ 
● Boolean isBeforeFirst() 如果游标位于第一行之前返回 true. 
●Boolean isAfterLast() 最后一行之后 
●boolean isFirst() 
●boolean isLast() 

三、可更新结果集 
1、特点:可更新结果集的数据并将这些更新保存到数据库中。 
2、创建方式: 
a.Statement:createStatement(int resultSetType,int reslutSetConcurrency) 
b.PrepareStatement:prepareStatement(String sql,int resultSetType,int reslutSetConcurrency) 
c.CallableStatement:prepareCall(String sql,int resultSetType,int reslutSetConcurrency) 
reslutSetConcurrency 为 CONCUR_UPDATABLE 
3、主要方法 
更新有两种方式,第一种方式是更新当前数据行的数据,如: 
rs.absolute(5); // 移动 rs 指针至第 5 行数据 
rs.updateString(“NAME”, “daniel”); // 将该行 name 列的值更新为“daniel” 
rs.updateRow(); // 更新数据源的数据 
第二种方式是插入一行数据,如: 
rs.moveToInsertRow(); // 将指针移动至插入行,插入行是 ResultSet 对象中的特殊行 
rs.updateString(1, 2); // 更新插入行中第一列的值为 2 
rs.updateInt(2, “daniel”); // 更新第二列中的值为 daniel 
rs.insertRow(); 
rs.moveToCurrentRow(); // 将指针移动至插入之前的位置

  
    展开阅读全文