2015-07-03 104 views
3

這樣的IM使用Statement來執行我的查詢和保存返回ResultSet在那麼ResultSet對象使用同一ResultSet對象,我遍歷從排在我的Java代碼中訪問MySQL數據庫結果並簡單地輸出每行的數據。結果集迭代只有一個時間,而循環

下面是代碼:

public class DBConnect { 
    private Connection conn; 
    private Statement st; 
    private ResultSet rs; 

    public DBConnect(){ 
     try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/unal_grades", "root", ""); 
      st = conn.createStatement(); 
     }catch(Exception ex){ 
      System.out.println("Error: " + ex); 
     } 
    } 

public ArrayList<Semester> getSemesters(){ 
    try{ 
     ArrayList<Semester> semesters = new ArrayList<Semester>(); 
     String query = "Select * from semester"; 
     rs = st.executeQuery(query); 
     System.out.println("semesters"); 
     while(rs.next()){ 
      int id = rs.getInt("id"); 
      String name = rs.getString("name"); 
      float average = rs.getFloat("average"); 
      boolean active = rs.getBoolean("active"); 

      System.out.println(name+"/"+average+"/"+active); 
      Semester semester = new Semester(id, name, average, active); 
      semester.setClasses(getClasses(semester)); 
      semesters.add(semester); 
     } 
     System.out.println(); 
     return semesters; 
    }catch(Exception ex){ 
     System.out.println("Error: " + ex); 
    } 
    return null; 
} 

我的問題是,在while循環中,rs.next()語句只在第一次循環返回true。換句話說,當它實際上有很多行時,它只會在數據庫中打印我的表的第一行。

調試時,如果我真的跑過來吧,當我真正在它的第一次迭代運行前檢查rs.next(),它進入循環,並打印出我的表的第二行。

非常感謝您的幫助。

+1

你的代碼不能編譯:你有沒有初始化'st'變量。 –

+0

你確定你的查詢返回多行嗎? – Ali786

+0

@ ali786我想,這就是他說的問題的調試部分。如果他在調試器中檢查了rs.next(),則會找到第二行。 – griFlo

回答

0

我的問題是,在getClasses()方法我也修改rs變量,所以在while循環變量是不一樣的,所以它返回false。

解決方法是使ResultSet rs在每種方法中都是局部變量。

這樣的:

public class DBConnect { 
    private Connection conn; 

    public DBConnect(){ 
     try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/unal_grades", "root", ""); 
     }catch(Exception ex){ 
      System.out.println("Error: " + ex); 
     } 
    } 

    public ArrayList<Semester> getSemesters(){ 
     ResultSet rs; 
     try{ 
      Statement st = conn.createStatement(); 
      ArrayList<Semester> semesters = new ArrayList<Semester>(); 
      String query = "Select * from semester"; 
      rs = st.executeQuery(query); 
      System.out.println("semesters"); 
      while(rs.next()){ 
       int id = rs.getInt("id"); 
       String name = rs.getString("name"); 
       float average = rs.getFloat("average"); 
       boolean active = rs.getBoolean("active"); 

       System.out.println(name+"/"+average+"/"+active); 
       Semester semester = new Semester(id, name, average, active); 
       semester.setClasses(getClasses(semester)); 
       semesters.add(semester); 
      } 
      System.out.println(); 
      return semesters; 
     }catch(Exception ex){ 
      System.out.println("Error: " + ex); 
     } 
     return null; 
    } 
} 
+0

正面...那就是爲什麼我對你寫的示例有疑問以前沒有邏輯錯誤或系統錯誤... – Ali786

0
Statement st; 
ResultSet rs; 
try{ 
    String query = "Select * from semester"; 
    st = con.createStatement(); 
    rs = st.executeQuery(query); 
    System.out.println("semesters"); 

    while(rs.next()){ 
    int id = rs.getInt("id"); 
    String name = rs.getString("name"); 
    float average = rs.getFloat("average"); 
    boolean active = rs.getBoolean("active"); 

    System.out.println(name+"/"+average+"/"+active); 
} 

System.out.println(); 
} catch(Exception ex){ 
    System.out.println("Error: " + ex); 
} 
+1

@SantiagoAlvarez他加了'st = con.createStatement();'(我認爲你在原始代碼中有什麼,否則你的Statement變量不會被初始化) – griFlo