2017-01-22 53 views
0
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條記錄之後也是如此。如何糾正它?雖然循環僅在一次迭代中終止

+1

Connection對象'如果rs.next {而rs.next {}}'將始終跳過第一條記錄。不太可能導致五跳,但這是你應該知道的。因爲它自然地包含在'while'中,所以完全放棄'if'位。 – paxdiablo

+0

RS.next()返回false,因此退出while循環。 –

+0

@marshal工藝是不是很明顯,如果條件成爲假它將終止...哈哈 – minigeek

回答

2

問題是您使用相同的語句對象來執行多個查詢。虛擬問題有:

  • 您既不關閉您的語句也不關閉您的結果集(請參閱示例)。

  • 您應該使用語句的參數(請參閱示例)。

  • 你不應該使用select *,而是列出你想從語句返回的列(我不會在這個例子中包含這個)。

  • 其中一個查詢(「從登錄中選擇類型」)總是以相同的方式重複,也許在查詢時出錯。否則它應該在主循環之外執行一次。

  • 在這個例子中

    我不管理連接,但是這也應該被做

讓我們假設你已經康恩稱爲

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

爲了增加保護,你可以使用try-with-resource,它會使它更清潔,但是否則,就會變好;) – MadProgrammer

0

您的問題是,每個連接一次只能處理一條SQL語句。您正在嘗試讓您的第一條select聲明處於打開狀態,而您正在進行其他一些聲明。您無法在單個連接上執行此操作。

我建議兩個更改,使這項工作。

  • 先對login表進行查詢。它的結果不會因一次迭代而變化,所以在主循環內反覆重複是沒有意義的。
  • detailsassignments的查詢重寫爲insert/select語句。這可能類似於以下內容。

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

此外,你可能會考慮寫一個PreparedStatement,這取決於SQL注入攻擊是否可能。