2012-09-22 88 views
0

我從表EmployeeLeave中提取記錄並將其存儲在結果集中。然後我將這個結果集插入數據庫表中,但是我只能插入結果集的第一行而不是所有的行。
我如何插入結果集的所有行?插入查詢僅插入數據庫表中結果集的第一行

r = stmt.executeQuery("select * from EmployeeLeave where EmployeeNo='"+empno+"'"); 
while(r.next()) 
{ 
    for(int i=0;i<=r.getRow();i++) 
    { 
     int empid = r.getInt(1); 
     String leave = r.getString(2); 
     r = stmt.executeQuery("insert into ApprovedLeave values('"+empid+"','"+leave+"','True')"); 
    } 
} 
+0

如果您正在學習Java,請以良好的方式學習並使用PreparedStatement而不是Statement。這裏有兩篇文章要閱讀:[爲什麼預備陳述很重要,以及如何正確使用它們](http://www.theserverside.com/news/1365244/Why-Prepared-Statements-are-important-and-how - 正確使用它們)和[使用準備好的語句](http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html)。 –

回答

1

不能調用executeQuery,同時通過ResultSetr迭代。這將有效地重置您的第一個ResultSet以及您的Statement,導致只有一個插入。要修復,請創建一個新的Statement。重新使用相同的JDBC聲明

stmt2.executeUpdate("insert into ApprovedLeave values('"+empid+"','"+leave+"','True')"); 
+0

我已經嘗試過不同的結果集,但它再次只插入第一行 – user1690973

+0

AFAIK您還需要創建一個新語句。 – Reimeus

+0

嘿謝謝!它的工作現在.. :) – user1690973

1

當你執行首次內部quert,它關閉的結果,從外部查詢設置,因爲你:

對於插入executeUpdate應該被使用。爲此,您需要使用兩個不同的語句對象實例。

但是,真的沒有理由將所有數據都回收到應用程序,只是將其發送回數據庫。你可能只是做類似(語法可能會因數據庫供應商略有不同):

"insert into ApprovedLeave select EmployeeNo, leave, 'True' from EmployeeLeave where EmployeeNo = '" + empno + "'" 

甚至更​​好,但將與一個PreparedStatement:

"insert into ApprovedLeave select EmployeeNo, leave, 'True' from EmployeeLeave where EmployeeNo = ?" 

,你那麼你的EMPNO變量綁定到聲明

0

這可能是因爲當您調用第二種方法時,r指向最後一行。你需要在下一次操作之前重置r嗎?

+0

這是一個有效的答案,但你應該付出更多的努力。閱讀[什麼是可接受的答案?](http://meta.stackexchange.com/a/118694/182862)以獲取更多信息,特別是從第8點到第11點。 –

相關問題