在遍历结果集的时候,用rs.isLast()来判断是否到达最后一条,结果报出异常:

java.sql.SQLException: 对只转发结果集的无效操作: isLast

在网上找到一个解决方法是:


java 代码

1. 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(); //将指针移动至插入之前的位置