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


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);
    }

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

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

  • 您既不关闭语句,也不关闭结果集(请参阅示例)。

  • 您应该使用语句的参数(请参阅示例)。

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

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

  • 在示例中,我不管理连接,但也应该这样做

假设您有一个名为 conn 的连接对象

  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();
 }

您的问题是每个连接一次只能处理一个 SQL 语句。 您试图在执行一堆其他语句时保持第一个select语句处于打开状态。 不能在单个连接上执行此操作。

我建议进行两项更改以使这项工作。

  • 首先对login表执行查询。 它的结果不会因一次迭代而异,因此在主循环中一遍又一遍地重复它是没有意义的。
  • 将针对detailsassignments的查询重写为插入/选择语句。 大概是下面这样。

.

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

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

最新更新