可以尝试读完一次就清除一次
朋友,建议你调整下代码结构,甚至可以把嵌套的几个查询分别抽象成一个方法,可以把参数传到方法里,返回你需要的结果.你的问题应该出在resultSet上,应该是你的resultSet数据只有一条,可以在resultSet定义位置加端点跟踪一下.
报错信息是什么
我之前也遇到过这样的错误,在创建statement对象时需要使用有参数的构造方法,把statement设置为可向上或向下滚动,,才能用resultset.next方法对查询到的结果集进行遍历。
Statement st =conn.createStatement(int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)
你可以看一下你创建的statement对象是不是用的无参数构造方法。
—----—-----------------------------------------------
2、可滚动的ResultSet类型。
这个类型支持前后滚动取得纪录next()、previous(),回到第一行first(),同时还支持要取的ResultSet中的第几行 absolute(int n),以及移动到相对当前行的第几行relative(int n),要实现这样的ResultSet在创建Statement时用如下的方法。
Statement st =conn.createStatement(int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)
这样得到的rs可以使用rs.next()方法进行遍历
其中两个参数的意义是:
resultSetType是设置ResultSet对象的类型标示可滚动,或者是不可滚动。
因为你关了连接,没打开。你的报错可能是什么connection error什么玩意的报错。
我是新手,我想请教一下为什么不用.hasnext()方法做循环条件?直接.next()的话如果没数据那不直接抛sql异常了?
1、朋友,你那么多while嵌套在一起,我们也不知道,你是哪个while出问题;
2、对于代码,咱们既然选择了面向对象的java,要不直接就按面向对象的方式来编写?
3、java是成熟的,只要你的使用方式正确,不会有太大的问题;
4、有疑问,可以来交流;
1、你的代码会报错:Operation not allowed after ResultSet closed
2、报错信息其实提示了报错的原因,就是ResultSet closed,造成ResultSet关闭的原因一般有两种:第一种就是在循环里面关闭了,这个把关闭操作放在循环外就可以;第二种是循环里面的其余操作,也会导致前面的ResultSet关闭;你的问题就是第二种,你在循环里面又调用了ResultSet操作。
解决(供参考):
Statement smt = conn.createStatement();
Statement smt2 = conn.createStatement();
Statement smt3 = conn.createStatement();
Statement smt4 = conn.createStatement();
ResultSet res = smt.executeQuery(sql_q);
ResultSet res2 = smt2.executeQuery(sql_q2);
ResultSet res3 = smt3.executeQuery(sql_q3);
ResultSet res4 = smt4.executeQuery(sql_q4);
这样就没有问题,最后记得要关闭(所有的都需要关闭,代码仅供参考)
// 关闭流 (先开后关)
res.close();
smt.close();
conn.close();
PS:你的代码,应该是想关联查询一些内容,其实可以在sql里面实现表的关联,返回一个结果集。开发的时候,尽量减少连接数据库的操作,这样能提高效率。