2012-02-13 82 views
4

我有一個問題,我想讀取結果集中的另一行,但不知道爲什麼我的循環不能結束在rs.next()。是的,我在tblPracownicy中獲得了超過1行。在DO之前,我使用while(rs.next())system.out.println(rs.getRow(1))檢查ResultSet內容,並且它看起來不錯,我得到的結果數量與我在tblPracownicy中獲得的行數相同。但在DO循環中,我不知道爲什麼它不會循環。這裏是代碼:爲什麼我不能讀取結果集中的下一行

ResultSet rs2 = stat.executeQuery("select _id, cykl_id, CyklDzien, CyklData, DataZatrudnienia, DataZwolnienia from tblPracownicy"); 
      //wygeneruj harmonogramy dla pracowników 
      long prac_id = rs2.getLong(1); 
      int offset; 
      Cykl cykl = null; 

      do 
      { //pracownicy 
       //odnajdź i pobierz cykl dla pracownika prac_id 
       if (cykl == null || cykl.cykl_id != rs2.getLong(2)) 
        for (Cykl c : cykle) 
         if (c.cykl_id == rs2.getLong(2)) 
         { 
          cykl = c; 
          break; 
         } 
       //ustaw offset cyklu na dzień 1.szy 
       GregorianCalendar gc_cykl = new GregorianCalendar(); 
       gc_cykl.setTime(rs2.getDate(4)); 
       gc_harm = new GregorianCalendar(rok, miesiac-1, 1); 
       //uwzględnij startowy dzień cyklu = CyklDzien 
       gc_cykl.add(GregorianCalendar.DAY_OF_MONTH, -rs2.getInt(3)+1); 
       offset = (int) ((gc_harm.getTimeInMillis() - gc_cykl.getTimeInMillis())/(3600000*24)) % cykl.dlugosc; 
       //przelicz offset na dodatni 
       if (offset < 0) offset = cykl.dlugosc + offset; 

       GregorianCalendar gc_zatr = new GregorianCalendar(new Integer(rs2.getString(5).substring(0, 4)), new Integer(rs2.getString(5).substring(5, 7)), new Integer(rs2.getString(5).substring(8))); 
       GregorianCalendar gc_zwol = null; 
       //if (!(rs2.getString(6) == null || rs2.getString(6).equals(""))) 
       if ((rs2.getString(6) != null && !rs2.getString(6).equals(""))) 
       { 
        gc_zwol = new GregorianCalendar(new Integer(rs2.getString(6).substring(0, 4)), new Integer(rs2.getString(6).substring(5, 7)), new Integer(rs2.getString(6).substring(8))); 
       } 
       //definiuj zmiany pracownika na cały miesiąc 
       for (int dzien=1; dzien <= max; dzien++) 
       { //dni 
        //w dni miesiąca kiedy pracownik nie jest zatrudniony wstawić dni wolne 
        gc_harm.set(rok, miesiac, dzien); 
        if (gc_harm.before(gc_zatr) || (gc_zwol != null && gc_harm.after(gc_zwol))) //jesli przed zatrudnieniem lub po zwolnieniu 
        { //wpisz dzien wolny = niekasowalne godziny 'xx - xx' o id = 0 
         stat.executeUpdate("insert into tblZmiany (Harmonogram_id, dzien, pracownik_id, godziny_id) " 
           + "values (" + id + ", " + dzien + ", " + prac_id + ", " + 0 + ");"); 
        }else{ 
         //wpisz zmianę 
         stat.executeUpdate("insert into tblZmiany (Harmonogram_id, dzien, pracownik_id, godziny_id) " 
           + "values (" + id + ", " + dzien + ", " + prac_id + ", " + cykl.godziny[offset] + ");"); 
        } 
        offset++; 
        if (offset >= cykl.dlugosc) offset = 0; 
       } 
      }while (rs2.next()); 
+0

能否請您說的究竟是什麼出了問題? 「不會循環」是什麼意思? – kornero 2012-02-13 12:21:44

回答

1

好的問題解決了,這兩個查詢在ResultSet的工作中會造成「干擾」。

if (gc_harm.before(gc_zatr) || (gc_zwol != null && gc_harm.after(gc_zwol))) //jesli przed zatrudnieniem lub po zwolnieniu 
       { //wpisz dzien wolny = niekasowalne godziny 'xx - xx' o id = 0 
        stat.executeUpdate("insert into tblZmiany (Harmonogram_id, dzien, pracownik_id, godziny_id) " 
          + "values (" + id + ", " + dzien + ", " + prac_id + ", " + 0 + ");"); 
       }else{ 
        //wpisz zmianę 
        stat.executeUpdate("insert into tblZmiany (Harmonogram_id, dzien, pracownik_id, godziny_id) " 
          + "values (" + id + ", " + dzien + ", " + prac_id + ", " + cykl.godziny[offset] + ");"); 
       } 

現在,我得到:

if (gc_harm.before(gc_zatr) || (gc_zwol != null && gc_harm.after(gc_zwol))) //jesli przed zatrudnieniem lub po zwolnieniu 
        { //wpisz dzien wolny = niekasowalne godziny 'xx - xx' o id = 0 
         listaZapytan[x++] = "insert into tblZmiany (Harmonogram_id, dzien, pracownik_id, godziny_id) " 
           + "values (" + id + ", " + dzien + ", " + prac_id + ", " + 0 + ");"; 
         System.out.println(listaZapytan[x-1]); 

        }else{ 
         //wpisz zmianę 
         listaZapytan[x++] = "insert into tblZmiany (Harmonogram_id, dzien, pracownik_id, godziny_id) " 
           + "values (" + id + ", " + dzien + ", " + prac_id + ", " + cykl.godziny[offset] + ");"; 
         System.out.println("cykl.godziny[" + offset + "] = " + cykl.godziny[offset]); 
         System.out.println(listaZapytan[x-1]); 
3

你應該用正常的while循環,而不是一個do ... while一個。

while(rs2.next()) { 
    // do your stuff 
} 

如果使用do ... while循環,該循環體中最先被執行,然後在條件被檢查。如果你沒有從數據庫中得到任何結果,這將會失敗。

請注意,ResultSet.next()調用不會檢查條件。它實際上推進了光標。像Iterator.next()的工作方式。

因此,在do block執行的第一次迭代中,光標指向無處(尚未進階,因爲您尚未調用其上的next()),導致您看到的行爲。

+0

'do .. while'的一大缺點是它至少執行一次,在你的情況下它會嘗試讀取最後一個記錄的下一個記錄... – 2012-02-13 12:21:39

+0

以前我確定了,而我從第二個元素開始循環並得到同樣的問題,我試圖讓rs.beforeFirst,但我得到錯誤「的ResultSet是TYPE_FORWARD_ONLY所以我已經改變做... while。 – Bulit 2012-02-13 12:34:11

+0

確保你唯一一次調用rs.next()是在'while(rs.next())'行,人們通常傾向於做一些事情,比如'System.out.println(「Has next?」+ rs.next());'調試時實際上會產生問題! – adarshr 2012-02-13 12:40:10

相關問題