Result set type is TYPE_FORWARD_ONLY解决方法

Result set type is TYPE_FORWARD_ONLY解决方法

参考文章:

https://www.zhihu.com/tardis/sogou/art/32800331

http://blog.sina.com.cn/s/blog_bb3b5c230102v4wa.html

声明:

从这两篇文章,得出了问题的解决办法,第二篇文章很详细了,但是函数的使用让我没有看懂,第一篇文章直接从参数说起,一眼就看懂了,在看第二篇的解决办法,瞬间就悟了,所有结果集游标移动问题都止于此。

解决办法:

将conn.createStatement()、conn.prepareStatement(sql)中更改成下面即可

`

conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE)

conn.prepareStatement("select *from score",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE)

原理:

conn.createStatement()、conn.prepareStatement(sql):生成的结果集:不滚动、不敏感、不可更新!

createStatement(int resultSetType, int resultSetConcurrency)
prepareStatement(String sql, int resultSetType,int resultSetConcurrency)

resultSetType 参数:

ResultSet.FETCH_FORWORD: 指定处理记录集中行的顺序是由前到后,即从第一行开始处理一直到最后一行。

ResultSet.FETCH_REVERSE: 指定处理记录集中行的顺序是由后到前,即从最后一行开始处理一直到第一行。

ResultSet.FETCH_UNKNOWN: 不指定处理记录集中行的顺序,而由JDBC 驱动程序和数据库系统决定。

ResultSet.TYPE_FORWARD_ONLY: 指定数据库游标的移动方向是向前,不允许向后移动,即只能使用ResultSet 接口的next()方法而不能使用previous()方法,否则会产生错误。(默认)

ResultSet.TYPE_SCROLL_INSENSITIVE: 指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作不敏感。

ResultSet.TYPE_SCROLL_SENSITIVE: 指定数据库游标可以在记录集中前后移动并且当前数据库用户获取的记录集对其他用户的操作敏感。

resultSetConcurrency 参数:

**CONCUR_READ_ONLY:**该常数的作用是指定当前记录集的协作方式(concurrency
mode)为只读。一旦使用了这个常数,那么用户就不可以更新记录集中的数据。

**CONCUR_UPDATABLE:**该常数的作用是指定当前记录集的协作方式(concurrency
mode)为可以更新。一旦使用了这个常数,那么用户就可以使用updateXXX()等方法更新记录集中的数据。

不设置默认为不滚动

ResultSet的方法分为两类,一类用来判断游标位置的,另一类是用来移动游标的。如果结果集是不可滚动的,那么只能使用next()方法来移动游标,而beforeFirst()、afterLast()、first()、last()、previous()、relative()方法等都不能使用!!!

如果结果集可以滚动,下面函数可以使用

public boolean absolute(int row);

该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行。参数row 指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算。

public boolean relative(int rows);

该方法的作用也是将记录集中的某一行设定为当前行,但是它的参数rows 表示目标行相对于当前行的行号。

public boolean first();

该方法的作用是将当前行定位到数据库记录集的第一行。

public boolean last();

该方法的作用刚好和first()方法相反,是将当前行定位到数据库记录集的最后一行。

public boolean isFirst();

该方法的作用是检查当前行是否记录集的第一行。如果是,返回true ,否则返回false。

public boolean isLast();

该方法的作用是检查当前行是否记录集的最后一行。如果是,返回true, 否则返回false。

public void afterLast();

该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的后面。如果该记录集不包含任何的行该方法不产生作用。

public void beforeFirst();

该方法的作用是将数据库游标移到记录集的最前面,位于记录集第一行的前面。如果记录集不包含任何的行,该方法不产生作用。

public boolean isAfterLast();

该方法检查数据库游标是否处于记录集的最后面。如果是,返回true, 否则返回false。

public boolean isBeforeFirst( );

该方法检查数据库游标是否处于记录集的最前面。如果是,返回true, 否则返回false。

public boolean next( );

该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行。当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面。

public boolean previous( );

该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。

public boolean rowDeleted( );

如果当前记录集的某行被删除了,调用该方法返回true,否则返回false 。

public boolean rowInserted( );

如果当前记录集中插入了一个新行,该方法将返回true,否则返回false。

public boolean rowUpdated( );

如果当前记录集的当前行的数据被更新,该方法返回true, 否则返回false。

public void insertRow( );

该方法将执行插入一个新行到当前记录集的操作。

public void updateRow( );

该方法将执行更新当前记录集当前行的数据。

public void deleteRow( );

该方法将执行删除当前记录集的操作。

public void updateString(int columnIndex, String x);

该方法更新当前记录集的当前行某列的值,该列的数据类型是String, 该方法的参数columnIndex 指定所要更新的列的列索引,第一列的列索引是1 ,以此类推。

public void updateString(String columnName, String x);

该方法同上,其第一个参数是columnName 代表需要更新的列的列名而不是columnIndex。

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示意思是:对于类型为resultset.type_forward_only的结果集,不允许进行该操作。 这个错误通常出现在使用JDBC进行数据库操作时,当使用了不支持的结果集类型或者对结果集进行了不支持的操作时,就会抛出这个异常。 解决方法是检查代码中对结果集的操作是否符合该结果集类型的限制,如果不符合,需要修改代码或者更换结果集类型。 ### 回答2: 这个错误信息涉及到 JDBC(Java Database Connectivity,Java 数据库连接)的 Result Set(结果集),是指数据库查询操作返回的数据结构。Result Set 其实是一个类似于记录集(recordset)的对象,包含了查询到的所有数据。 但是,Result Set 可以有不同类型,其中有一种类型叫做 type_forward_only(只能向前读取),表示结果集只能按顺序一行一行地向前读取,不能跳过某一行或倒退。这种结果集比较轻量级,占用资源较少,适合快速读取大量数据。 而当我们对 type_forward_only 类型的 Result Set 执行类似于更新、删除、新增等操作时,就会出现“operation not allowed for a result set of type resultset.type_forward_only”的错误消息。 这个错误产生的原因是因为 type_forward_only 类型的 Result Set 并没有把整个结果集都缓存起来,而是逐行读取,执行更新操作需要重新定位 Result Set 的位置。而根据 JDBC 的规范,我们只能在类型为 ResultSet.TYPE_SCROLL_SENSITIVE 和 ResultSet.TYPE_SCROLL_INSENSITIVE 的 Result Set 上执行更新、删除和新增操作。 因此,我们需要将查询操作的结果集类型指定为 ResultSet.TYPE_SCROLL_SENSITIVE 或 ResultSet.TYPE_SCROLL_INSENSITIVE,才能在结果集上执行更新、删除、新增操作。在使用 ResultSet 的时候,需要注意其类型以及支持的操作,才能正确处理数据和防止出现异常。 ### 回答3: 这个错误是由于尝试使用已关闭的类型为FORWARD_ONLY的ResultSet进行更新、删除或插入操作所引发的。ResultSetJava中用于存储和处理数据库查询结果集的接口类型。FORWARD_ONLY是ResultSet的一种类型,它只能按照查询结果集中的顺序依次向前读取记录,不可以向后读取记录。 ResultSet是默认为只读的,不能进行更新操作。如果需要进行更新操作,则需要ResultSet设置为可更新类型,如: ResultSet rs = stmt.executeQuery("SELECT * FROM students"); rs.setConcurrency(ResultSet.CONCUR_UPDATABLE); 这样ResultSet就可以进行更新操作了。但是需要注意,如果ResultSet只是按照查询结果集的顺序向前读取记录,而不是完整地将所有记录加载到内存中,那么就无法进行更新、删除或插入操作,因为需要使用ResultSet的绝对位置来定位要更新、删除或插入的记录。如果ResultSet类型为FORWARD_ONLY,则无法使用绝对位置。 解决这个问题的方法是将ResultSet设置为可滚动类型,并对ResultSet进行完整的加载,如: ResultSet rs = stmt.executeQuery("SELECT * FROM students"); rs.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); rs.setConcurrency(ResultSet.CONCUR_UPDATABLE); while(rs.next()){}; 这样就可以在ResultSet中使用绝对位置来访问记录,并进行更新、删除或插入操作。但是需要注意,如果要对ResultSet进行更新、删除或插入操作需要确保数据库表中对应的记录没有被其他应用程序修改过,否则可能会引发并发异常。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值