所以我有这样的密码:
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);
发布于 2021-10-25 22:40:32
理论上,任何ResultSet都可以倒退、向前、开始、结束,以及你喜欢的任何位置。至少,它有解决所有这些问题的方法。
不幸的是,实际上“交付”这个承诺的功能是昂贵的。事实上,价格太高了,你可以告诉一个ResultSet,你希望它违背这些承诺,而不是节省内存等等。
这就是这里所发生的事情:你有一个只向前的结果集。在所有导航到行的方法中, 只 .next() 正常工作,所有其他方法都抛出该异常。
.next()
这有点奇怪,因为 relative(1) 的意思是“向前移动1行”,这与 next() 所做的完全一样,但是, next() 工作并得到保证,并且任何JDBC驱动程序都可以在 relative(1) 上自由地失败。
relative(1)
next()
但是,从您编写问题的方式来看,您似乎没有意识到 .relative(1) 和 .next() 在含义上是相同的(只是在实践中不相同,因为有一些 .next() 正常工作的配置,以及 relative(1) 抛出的配置。
.relative(1)
因此,最有可能的解决方法是:重新阅读文档,并熟悉这些方法所做的事情;您之前一定误解了这些方法。
但是,如果您只是在玩(明确地说, .relative(1) 应该永远不会编写)。 .next() 是您应该如何编写的),仅为了学习目的,您有两个选项:
con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, "theSql")
发布于 2021-10-25 23:01:44
这就是它支付给 阅读JAVADOC 的地方
布尔相对(int行)SQLException --如果发生数据库访问错误,则在关闭的结果集上调用此方法,或者结果集类型为TYPE_FORWARD_ONLY .自: 1.2
发布于 2021-10-25 22:38:06
TYPE_FORWARD_ONLY意味着您只能在结果集上前进,而不是向后移动,所以当您试图返回beforeFirst()时会得到一个异常。尝试使用prepareStatement(),如下所示:
pstat=con.prepareStatement("select * from knjiga"); rs=pstat.executeQuery(); int rowCount=0;