java - While 循环仅在一次迭代中终止

标签 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 循环也仅在一次迭代中终止。如何纠正?

最佳答案

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

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

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

  • 您不应使用 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();
 }

关于java - While 循环仅在一次迭代中终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41787458/

相关文章:

java - 哪个 API : JavaFX or JMF is better for audio processing in Java?

php - 将行中的数据放入无 php 站点进行编辑

database - 从语言实现的角度来看,实现 F# 3.0 中的类型提供程序需要什么?

database - 在 Golang 中缓存数据库结果( revel )

mysql - 无法使用 MAMP 或社区服务器连接到 mysql 服务器

java - 屏幕宽度和高度 LWJGL

java - 将父类(super class)对象作为参数传递给子类构造函数(java)

java - 无法将对象删除到 ArrayList 中

ios - swift Sqlite3_column_text()

java - 关于 Java 中私有(private)静态嵌套类的合成访问器的 Eclipse 警告?