相关文章推荐
冷冷的警车  ·  中国金融学术研究网·  1 年前    · 
深情的围巾  ·  高分罪案/探案英剧推荐- 知乎·  1 年前    · 
风度翩翩的凳子  ·  水晶宫vs阿森纳直播【掌触体育】·  1 年前    · 
霸气的充电器  ·  1942-1999:犀飞利七代胜利尖的演变- ...·  1 年前    · 
爱看球的伤疤  ·  2022年镇江市新区实验幼儿园教师招聘公告(1名)·  1 年前    · 
小百科  ›  java.sql.SQLException:不强迫ResultSet.TYPE_FORWARD_ONLY类型的结果五集的操作方法。为什么?-腾讯云开发者社区-腾讯云
resultset
活泼的草稿本
1 年前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

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

Stack Overflow用户
提问于 2021-10-25 22:18:00
EN

所以我有这样的密码:

public static void ispisiSvakuDruguKnjigu(){
                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上它显示了这样的错误:

java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.

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

我改变了这个:

 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
3 3.4K 0 票数 0
EN
java
mysql

回答 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(),如下所示:

pstat=con.prepareStatement("select * from knjiga");             
        rs=pstat.executeQuery();
        int rowCount=0;
 
推荐文章
冷冷的警车  ·  中国金融学术研究网
1 年前
深情的围巾  ·  高分罪案/探案英剧推荐- 知乎
1 年前
风度翩翩的凳子  ·  水晶宫vs阿森纳直播【掌触体育】
1 年前
霸气的充电器  ·  1942-1999:犀飞利七代胜利尖的演变- 哔哩哔哩
1 年前
爱看球的伤疤  ·  2022年镇江市新区实验幼儿园教师招聘公告(1名)
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号