我在尝试读取ResultSet中的另一行时遇到了问题,但不知道为什么我的循环不能在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());
应该使用普通的while
循环,而不是do ... while
循环。
while(rs2.next()) {
// do your stuff
}
如果使用do ... while
循环,则首先执行循环的主体,然后检查条件。如果你没有从数据库中得到任何结果,这将失败。
请记住,ResultSet.next()
调用不会只是检查条件。它实际上使光标前进。类似于Iterator.next()
的工作方式。
因此,在执行do block
的第一次迭代中,光标不指向任何位置(由于您尚未调用它上的next()
,所以它尚未前进),这导致了您所看到的行为。
ok问题解决了,这两个查询对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]);