java 此操作只对_java.sql.SQLException: 对只转发结果集的无效操作: last异常解决

初学者对建立对象时没有太注意,后来知道在建立Statement时加入相关参数,就可以解决了。

操作查询结果集的过程中出现异常

出现异常的语句:

rs.last();

异常的详细信息:对只转发结果集的无效操作:

last

解决办法: stat =

conn.createStatement();

改为

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

就可以了

分析:

异常出现于移动结果集的指针时,原因是在生成statement对象的时候提供的参数不同

无参数的那个方法使用的是默认参数,statement执行后得到的结果集类型为

ResultSet.TYPE_FORWARD_ONLY.这种类型的结果集只能通过rs.next();方法逐条读取,使用其他方法就会报异常.

如果想执行一些复杂的移动结果集指针的操作就要使用其他参数了

顺便简单介绍一下各个参数:

ResultSet.TYPE_FORWARD_ONLY

(略)

ResultSet.TYPE_SCROLL_INSENSITIVE

双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。

ResultSet.TYPE_SCROLL_SENSITIVE

双向滚动,并及时跟踪数据库里的更新,以便更改ResultSet中的数据。

ResultSet.CONCUR_READ_ONLY

只读取ResultSet

ResultSet.CONCUR_UPDATABLE

用ResultSet更新数据库

代码如下:

Statement

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery(sql);

rs.last(); int length =

rs.getRow();

如上,length的值,就是行数了。如果在获取了行数后,还需要继续使用当前数据集rs,则需要rs.beforeFirst();一次,将游标回到初始位置。

ResultSet.TYPE_SCROLL_INSENSITIVE

结果集的游标可以上下移动,当数据库变化时,当前结果集不变。

ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。

此外,给出Statement创建时的其他说明:

通用格式为:Statement stmt=con.createStatement(int type,int

concurrency);我们在访问数据库的时候,在读取返回结果的时候,可能要前后移动指针,比如我们先计算有多少条信息,这是我们就需要把指针移到最后来计算,然后再把指针移到最前面,逐条读取,有时我们只需要逐条读取就可以了。还有就是有只我们只需要读取数据,为了不破坏数据,我们可采用只读模式,有时我们需要望数据库里添加记录,这是我们就要采用可更新数据库的模式。

下面是所有参数的说明:

参数 int type

ResultSet.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动。

ResultSet.TYPE_SCROLL_INSENSITIVE

结果集的游标可以上下移动,当数据库变化时,当前结果集不变。

ResultSet.TYPE_SCROLL_SENSITIVE

返回可滚动的结果集,当数据库变化时,当前结果集同步改变。

参数 int concurrency

ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。

ResultSet.CONCUR_UPDATETABLE 能用结果集更新数据库中的表。

此外,当我们使用ResultSet

re=stmt.executeQuery(SQL语句)查询后,我们可以使用下列方法获得信息:

public boolean previous()

将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时,返回false。

public void beforeFirst

将游标移动到结果集的初始位置,即在第一行之前。

public void afterLast() 将游标移到结果集最后一行之后。

public void first() 将游标移到结果集的第一行。

public void last() 将游标移到结果集的最后一行。

public boolean isAfterLast()

判断游标是否在最后一行之后。

public boolean isBeforeFirst()

判断游标是否在第一行之前。

public boolean ifFirst()

判断游标是否指向结果集的第一行。

public boolean isLast()

判断游标是否指向结果集的最后一行。

public int getRow()

得到当前游标所指向行的行号,行号从1开始,如果结果集没有行,返回0。

public boolean absolute(int row)

将游标移到参数row指定的行号。如果row取负值,就是倒数的行数,absolute(-1)表示移到最后一行,absolute(-2)表示移到倒数第2行。当移动到第一行前面或最后一行的后面时,该方法返回false。

在Java中,获得ResultSet的总行数的方法有以下几种。

第一种:利用ResultSet的getRow方法来获得ResultSet的总行数

Statement stmt =

con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

ResultSet rset = stmt.executeQuery("select * from

yourTableName");

rset.last();

int rowCount = rset.getRow(); //获得ResultSet的总行数

第二种:利用循环ResultSet的元素来获得ResultSet的总行数

ResultSet rset = stmt.executeQuery("select * from

yourTableName");

int rowCount = 0;

while(rset.next()) {

rowCount++;

}

rowCount就是ResultSet的总行数。

第三种:利用sql语句中的count函数获得ResultSet的总行数

ResultSet rset = stmt.executeQuery("select count(*) totalCount

from yourTableName");

int rowCount = 0;

if(rset.next()) {

rowCount=rset .getInt("totalCount ");

}

rowCount就是ResultSet的总行数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值