while循环仅在一次迭代中终止

时间:2017-01-22 04:47:37

标签: java database

try { 
       ResultSet rs = stat.executeQuery("select * from details where COURSEANDDEPT='"+username+"'");
        //if (rs.next()) {    
            while (rs.next()) {
                String logid=rs.getString(1);
                char temp=' ';
                ResultSet ag=stat.executeQuery("select type from login");
                if (ag.next()) {
                    temp=ag.getString(1).charAt(0);
                    if (temp=='s' || temp=='S') {
                        String logid=ag.getString(1);
                        stat.executeQuery("insert into assignments values('"+logid+"','"+comments+"','P','"+userid+"','"+username+"')");
                    }
                }  
            }
                JOptionPane.showMessageDialog(this,"Assignment Sent To The Whole Class");
            //} else {
                //JOptionPane.showMessageDialog(this,"Invalid Branch");
            //}
    } catch (ClassNotFoundException | SQLException ex) {
        Logger.getLogger(Assignments.class.getName()).log(Level.SEVERE, null, ex);
    }

即使在自身包含6条记录之后,rs.next()的while循环也只在一次迭代中终止。如何纠正它?

2 个答案:

答案 0 :(得分:2)

问题是您使用相同的语句对象来执行多个查询。成瘾问题是

  • 您既不关闭您的陈述也不关闭您的结果集(参见示例)。

  • 你应该使用陈述'参数(见例)。

  • 您不应该使用select *,而是列出您想要从语句中返回的列(我不会在示例中包含此内容)。

  • 其中一个查询("从登录中选择类型")总是以相同的方式重复,可能在查询中出现错误。否则它应该在主循环之外执行一次。

  • 在示例中我没有管理连接但是这也应该这样做

假设您有一个名为conn

的Connection对象
  PreparedStatemet stat=null;
  PreparedStatement innerStat=null;
  PreparedStatement insertStat=null;

  try { 
     stat=conn.prepareStatement("select * from details where COURSEANDDEPT=?");
     stat.setString(1,username);

     ResultSet rs = stat.executeQuery();
     //if (rs.next()) {    
        while (rs.next()) {
            String logid=rs.getString(1);
            char temp=' ';
            innerStat=conn.prepareStatement("select type from login");
            ResultSet ag=innerStat.executeQuery();

            if (ag.next()) {
                temp=ag.getString(1).charAt(0);
                if (temp=='s' || temp=='S') {
                    String logid=ag.getString(1);
                    ag.close();
                    innerStat.close();
                    insertStat=conn.prepareStatement("insert into assignments values(?,?,?,?,?)");
                    insertStat.setString(1,logId);
                    insertStat.setString(2,comments);
                    insertStat.setString(3,"P");
                    insertStat.setString(4,userid);
                    insertStat.setString(5,username);

                    insertStat.executeUpdate();
                    insertStat.close();


                }//closes if on temp
            }  //closes if on ag
        } //closes while
        rs.close();
        stat.close();
            JOptionPane.showMessageDialog(this,"Assignment Sent To The Whole Class");
        //} else {
            //JOptionPane.showMessageDialog(this,"Invalid Branch");
        //}
  } catch (ClassNotFoundException | SQLException ex) {
    Logger.getLogger(Assignments.class.getName()).log(Level.SEVERE, null, ex);
     if(insertStat!=null) insertStat.close();
     if(innerStat!=null) innertStat.close();
     if(stat!=null) stat.close();
 }

答案 1 :(得分:0)

您的问题是每个连接一次只能处理一个SQL语句。当您执行大量其他语句时,您正试图将第一个select语句保持打开状态。你不能在一个连接上这样做。

我建议进行两项修改以使其发挥作用。

  • 首先对login表进行查询。它的结果从一次迭代到下一次迭代都不会有所不同,所以在主循环中反复重复它没有意义。
  • detailsassignments的查询重写为insert / select语句。它可能类似于以下内容。

"insert into assignments " +
"select logid,  ,'" + comments + "','P','" + userid + "','" + username + "' "
"from details " +
"where COURSEANDDEPT='"+username+"'"

此外,您可以考虑使用PreparedStatement编写此内容,具体取决于SQL注入攻击是否可能。

相关问题