2012-02-13 49 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

相关问题