ResultSet关闭后不允许操作?

时间:2016-05-11 11:47:18

标签: java sql jdbc

我理解当ResultSet一次只能打开一次时会出现此问题。所以我补充道 的更新

try
{          
  String sql = "SELECT * FROM test;
  ResultSet rs = stmt.executeQuery(sql);

  if(rs.next()){
    do {
        if(rs.getString("sent").equals("0")) {
            try {

                //update

                try {
                    String psSQL = "UPDATE sent SET ..........";
                    updateStatement = conn.prepareStatement(psSQL);
                    updateStatement.setString(1, ....);
                    updateStatement.setString(2, ....);
                    updateStatement.setString(3, ...);

                    updateStatement.executeUpdate();
                    System.out.println("Record updated");
                } catch (SQLException e) {
                    System.out.println(e.getMessage());
                } finally {
                    if(updateStatement != null) {
                        updateStatement.close();
                    }
                    if (conn != null) {
                        conn.close();
                    }
                }

            } catch (MessagingException mex) {
             mex.printStackTrace();
            }
        }
    } while(rs.next()); **<---- Still same Error here**
  } else if (rs.getRow() == 0) {
    if (!mailSender.equals(".....")) {
        try{
                //insert

             try {
                    String psSQL2 = "INSERT INTO sent"
                            + "(......) VALUES"
                            + "(?,?,?)";
                    insertStatement = conn.prepareStatement(psSQL2);
                    insertStatement.setString(1, ...);
                    insertStatement.setString(2, ....);
                    insertStatement.setString(3, ....);

                    insertStatement.executeUpdate();
                    System.out.println("Insert done!");
             } catch (SQLException e) {
                System.out.println(e.getMessage());
             } finally {
                if(insertStatement != null) {
                    insertStatement.close();
                }
                if (conn != null) {
                    conn.close();
                }
             }                 
          }catch (MessagingException mex) {
             mex.printStackTrace();
          }
    } else {
        return null;
    }
  }
}
catch (SQLException se)
{
  se.printStackTrace();
}
catch (Exception e)
{
  e.printStackTrace();
}
finally
{
  try
  {
    if (stmt != null) {
      stmt.close();
    }
  }
  catch (SQLException se2) {}
  try
  {
    if (conn != null) {
      conn.close();
    }
  }
  catch (SQLException se)
  {
    se.printStackTrace();
  }
}

所以..当while(rs.next())运行时我得到错误。我在rs.next()之前和之后输入了system.out.println,而在循环之后输入了第n个和第n个母猪。

我尝试使用另一个结果集rs2,但它也没有工作,所以我不知道这个问题是来自......

2 个答案:

答案 0 :(得分:1)

更好的方法就是使用单个META-INF/services

a simple service-provider loading facility

希望这有帮助。

答案 1 :(得分:0)

ResultSet与创建它的Statement相关联。通过重复使用Statement,您将关闭第一个ResultSet

如果您希望代码能够正常工作,则需要对第二个Statement使用秒ResultSet