首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.sql.SQLException:不允许ResultSet.TYPE_FORWARD_ONLY类型的结果集的操作。为什么?

java.sql.SQLException:不允许ResultSet.TYPE_FORWARD_ONLY类型的结果集的操作。为什么?
EN

Stack Overflow用户
提问于 2021-10-25 22:18:00
回答 3查看 3.4K关注 0票数 0

所以我有这样的密码:

代码语言:javascript
运行
复制
public static void ispisiSvakuDruguKnjigu(){
            try{
                Connection conn = getConnection();
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("select * from knjiga");
                while(true){
                    if(rs.next()){
                        System.out.println(rs.getString("id")+" "+rs.getString("naslov"));
                        rs.relative(2);
                    } else {
                        return;
                    }
                }
            } catch (Exception e){
                e.printStackTrace();
            }
        }

我们是在一个从MySQL数据库中每读第二本书的班级中做的,它在我正在观看的类上正常工作,但是在我的PC上它显示了这样的错误:

代码语言:javascript
运行
复制
java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.

编辑首先我要感谢大家的支持,我是一个晚学习者,也是一个非常大的初学者。我已经成功地测试了它,并根据您的解析器修复了代码,使其能够按预期工作。我的困惑主要是因为我观察的过程和我的代码完全一样,它对他们有效,而不必做我所做的事情。再次感谢大家的耐心,为困惑感到抱歉。

我改变了这个:

代码语言:javascript
运行
复制
 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-25 22:40:32

理论上,任何ResultSet都可以倒退、向前、开始、结束,以及你喜欢的任何位置。至少,它有解决所有这些问题的方法。

不幸的是,实际上“交付”这个承诺的功能是昂贵的。事实上,价格太高了,你可以告诉一个ResultSet,你希望它违背这些承诺,而不是节省内存等等。

这就是这里所发生的事情:你有一个只向前的结果集。在所有导航到行的方法中, .next()正常工作,所有其他方法都抛出该异常。

这有点奇怪,因为relative(1)的意思是“向前移动1行”,这与next()所做的完全一样,但是,next()工作并得到保证,并且任何JDBC驱动程序都可以在relative(1)上自由地失败。

但是,从您编写问题的方式来看,您似乎没有意识到.relative(1).next()在含义上是相同的(只是在实践中不相同,因为有一些.next()正常工作的配置,以及relative(1)抛出的配置。

因此,最有可能的解决方法是:重新阅读文档,并熟悉这些方法所做的事情;您之前一定误解了这些方法。

但是,如果您只是在玩(明确地说,.relative(1)应该永远不会编写)。.next()是您应该如何编写的),仅为了学习目的,您有两个选项:

  1. 将ResultSet配置为完全可导航。这通常被称为“可滚动结果集”。con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, "theSql")会这么做的。不过,我不推荐这样做--通常只是编写代码,这样就不必滚动了。
  2. 代之以打电话给.next()
票数 -2
EN

Stack Overflow用户

发布于 2021-10-25 23:01:44

这就是它支付给阅读JAVADOC的地方

布尔相对​(int行)SQLException --如果发生数据库访问错误,则在关闭的结果集上调用此方法,或者结果集类型为TYPE_FORWARD_ONLY .自: 1.2

票数 0
EN

Stack Overflow用户

发布于 2021-10-25 22:38:06

TYPE_FORWARD_ONLY意味着您只能在结果集上前进,而不是向后移动,所以当您试图返回beforeFirst()时会得到一个异常。尝试使用prepareStatement(),如下所示:

代码语言:javascript
运行
复制
pstat=con.prepareStatement("select * from knjiga");             
        rs=pstat.executeQuery();
        int rowCount=0;

        while(rs.next())
        {
           System.out.println(rs.getString("id")+" "+rs.getString("naslov"));
                        
        }
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69715378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档