2011-04-19 113 views
1

我寫代碼,以從表中檢索兩列,並將其存儲在另一個table.i正在使用MS接入作爲數據庫。 代碼如下如何從一個表中提取數據,並插入到另一個表

public void connectDb(){ 
    try{ 

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection con=DriverManager.getConnection("jdbc:odbc:harish","scott","tiger"); 
    Statement st= con.createStatement(); 
    ResultSet rs=st.executeQuery("select sev,al from pgw_alarm where sev='000'"); 
    while(!rs.next()) 
    { 
    String sev= rs.getString("sev"); 
    String al= rs.getString("al"); 
    st.executeUpdate("insert into info_alarm values('"+sev+"','"+al+"')"); 
    } 
}catch(Exception e){e.printStackTrace(); 
    System.out.println("some error");} 
} 

以下堆棧跟蹤

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state 
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957) 

    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114) 
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3907) 
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5698) 
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:354) 
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:411) 

請幫我解決這個問題.....

+0

不知道這是錯誤,反正儘量放一個「;」在查詢字符串的末尾 – Heisenbug 2011-04-19 08:39:26

+0

您顯示的堆棧跟蹤中包含行號。如果你可以告訴我們,而上面的代碼行是拋出異常的行,這將是非常有幫助的。 – 2011-04-19 08:51:29

回答

2

這應該在一個查詢中是可能的:

INSERT INTO info_alarm (sev, al) 
    SELECT sev, al FROM pgw_alarm where sev='000'; 

這將是更清潔和更快速的方式。

while (!rs.next())!可能只是一個錯字,對不對?

編輯:要回答你的問題,尋找到JavaDoc

默認情況下,只有每一個Statement對象ResultSet對象可以在同一時間打開。因此,如果一個ResultSet對象的讀取與另一個ResultSet對象的讀取交錯,則每個對象必須由不同的Statement對象生成。 Statement接口中的所有執行方法隱式關閉一個語句的當前ResultSet對象(如果存在一個打開的對象)。

基本上ResultSet還是從語句讀取,但您在通過在同一Statement執行另一個查詢關閉它。如果你想這樣做,你需要使用兩個單獨的語句。

0
while(!rs.next()) 

你爲什麼要檢查!rs.next()ResultSet.next()如果光標指向有效行,則返回true,如果不存在更多行,則返回false。如果你的查詢沒有返回結果,rs.next()將返回false。 !rs.next() - >not false - >true - >您while塊將執行對空結果集。

這幾乎可以肯定你的問題是什麼。將其更改爲while(rs.next())

0

相當肯定,問題是由重用Statement情況引起的。它在JavaDoc中說:

Statement接口中的所有執行方法隱式關閉統計數據的當前ResultSet對象(如果存在打開的話)。

因此,當您執行insert語句時,實際結果集被關閉,並且可能會拋出異常。 (「無效的光標狀態」是另一個提示)

創建不同Statement情況下,一個用於讀,另一個用於所述多個插入物。這應該修復這個問題。

+0

感謝您的建議。 – Harish 2011-04-26 19:05:46

相關問題