java.sql.SQLException:结果集已关闭
我无法执行进一步的处理,因为我在运行此代码时关闭了ResultSet。我在sqlite数据库表的15行之后添加值,我想找到15行的平均值,它应该存储在ArrayList中 代码如下:-java.sql.SQLException:结果集已关闭,java,sqlite,Java,Sqlite,我无法执行进一步的处理,因为我在运行此代码时关闭了ResultSet。我在sqlite数据库表的15行之后添加值,我想找到15行的平均值,它应该存储在ArrayList中 代码如下:- try { Class.forName("org.sqlite.JDBC"); c = DriverManager.getConnection("jdbc:sqlite:test.db"); c.setAutoCommit(false); System.out.println("O
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:test.db");
c.setAutoCommit(false);
System.out.println("Opened database successfully3");
stmt = c.createStatement();
rs = stmt
.executeQuery("SELECT TIME,BID,ASK FROM '" + title + "' ;");
System.out.println("Opened database successfully 20");
while (rs.next()) {
i++;
System.out.println(i);
if (i > 15) {
System.out.println("i am in");
List<String> stocklist = new ArrayList<String>();
String main = rs.getString(1);
System.out.println(rs.getString(1));
String s[] = main.split(" ", 2);
String date = s[0];
String time = s[1];
stocklist.add(date);
stocklist.add(time);
stocklist.add(df.format(rs.getFloat("BID")));
stocklist.add(df.format(rs.getFloat("ASK")));
rs1 = stmt
.executeQuery("SELECT ASK FROM '" + title + "' ;");
int j = 1;
while (rs1.next()) {
if (j < i) {
System.out.println(rs1.getFloat("ASK"));
avg = avg + rs1.getFloat("ASK");
}
j++;
}
rs1.close();
System.out.println("i am out");
avg = avg / 15;
changepercent = ((rs.getFloat("ASK") - avg) / avg) * 100;
stocklist.add(df.format(changepercent));
stocklist.add("ETE");
stocklist.add("HUN");
stocklist.add("ALU");
stocklist.add("ETE");
stocklist.add("HUN");
stocklist.add("ALU");
stocklist.add("ETE");
stocklist.add("HUN");
hntm.addRow(stocklist);
}
}
rs.close();
stmt.close();
c.close();
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
试试看{
Class.forName(“org.sqlite.JDBC”);
c=DriverManager.getConnection(“jdbc:sqlite:test.db”);
c、 设置自动提交(错误);
System.out.println(“已成功打开数据库3”);
stmt=c.createStatement();
rs=stmt
.executeQuery(“从“+”标题“;”)中选择时间、出价、询问”;
System.out.println(“已成功打开数据库20”);
while(rs.next()){
i++;
系统输出打印LN(i);
如果(i>15){
System.out.println(“我在”);
List stocklist=new ArrayList();
字符串main=rs.getString(1);
System.out.println(rs.getString(1));
字符串s[]=main.split(“,2);
字符串日期=s[0];
字符串时间=s[1];
存货清单。添加(日期);
存货清单。添加(时间);
添加(df.格式(rs.getFloat(“投标”));
stocklist.add(df.format(rs.getFloat(“ASK”));
rs1=stmt
.executeQuery(“从“+”标题+“;”中选择询问”;
int j=1;
while(rs1.next()){
if(j
不应重复使用语句。创建新查询时,需要使用新的语句对象。替换rs1=stmt.executeQuery(“从“+”标题+“;”中选择询问”)代码>带有rs1=c.createStatement().executeQuery(“从“+”标题+“;”中选择询问”)代码>这不是这个问题的答案,但我对java.sql.SQLException:ResultSet closed也有问题
在我的例子中,查询结果是空的,我使用的是SQLite,因此结果集返回closed
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
// resultSet closed == didn't find anything
if(resultSet.isClosed())
return false;
我使用PostgreSQL进行测试,结果集即使在查询为空时也保持打开状态。我没想到不同的数据库会有不同的行为
如果有人想检查我的测试:
如前所述,检查连接是否仍然打开的更好方法是使用resultSet.isnext()
尝试在rs1Thanks循环中创建另一个语句。很多时候,它都在工作。。。w您不能同时从同一语句中使用多个结果集
对象。我同意:这肯定不是答案。这也不正确ResultSet.next()
返回false
表示未找到任何内容。你不可能从这段代码中得到resultSet.isClosed()==true
。@marqueisoflorne你是对的,next()
是正确的方法。在使用SQLite时,我实际上得到了resultSet.isClosed()==true
,在使用PostgreSQL时得到了resultSet.isClosed()==false
(今天勾选)。更新了答案,以便更清楚地了解我何时遇到此异常。您可以重用语句
对象。这个答案是不正确的。问题出在别处。