2015-03-03 93 views
4

我正在開發Web服務。我以爲我準備發佈我的第一個生產版本,但我一直在收到一個對我沒有任何意義的SQLException。我正在開發一個Oracle數據庫順便說一句。 讓我給你一我的代碼:獲取SQLException java.sql.SQLException:未調用ResultSet.next

try{ 
    variable = DoQuery("SELECT KEY FROM TABLE WHERE KEY IN ('KEY1', 'KEY2') AND ROWNUM = 1").getString("HANDLE"); 
}catch(SQLException e){ 
    return "Wasn't able to gather key: " + e.toString() + " - " + e.getSQLState(); 
} 

的方法 「DoQuery」:

private ResultSet DoQuery(String sqlString){ 
    Statement sqlHandleStatement; 
    try { 
     sqlHandleStatement = getStatement(); 
     return sqlHandleStatement.executeQuery(sqlString); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

的方法 「getStatement」:

private Statement getStatement() throws SQLException { 
    DataSource dataSource = null; 
    try { 
     dataSource = (DataSource) JNDIUtils.getInitialContext().lookup(JNDIUtils.DEFAULT_DATASOURCE); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
    Connection connection; 

    connection = dataSource.getConnection(); 
    Statement statement; 
    statement = connection.createStatement(); 
    return statement; 
} 

但是如果我執行我的SOAP請求我不斷收回:

<SOAP-ENV:Envelope xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
     <ns2:getNextRMANumberResponse xmlns:ns2="http://webservice.epm.com/"> 
     <return>Wasn't able to gather key: java.sql.SQLException: ResultSet.next was not called - 99999</return> 
     </ns2:getNextRMANumberResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

錯誤消息:「無法收集密鑰:java.sql.SQLException:ResultSet.next未被調用 - 99999」(與本文中給出的第一個代碼片段相比)

這是什麼意思?我真的不明白爲什麼我應該執行「ResultSet.next」?!

在此先感謝!

回答

9

您必須調用「next」,然後使用「getString」函數將結果集光標設置到第一行上。

try{ 
    ResultSet resuse = DoQuery("SELECT KEY FROM TABLE WHERE KEY IN ('KEY1', 'KEY2') AND ROWNUM = 1"); 
    resuse.next(); 
    variable = resuse.getString("KEY"); 
}catch(SQLException e){ 
    return "Wasn't able to gather key: " + e.toString() + " - " + e.getSQLState(); 
} 

API documentation狀態:

最初,光標定位在第一行之前。

+0

如果我接下來會調用( )首先我會得到一個布爾值,所以不能調用「getString」方法。 – OddDev 2015-03-03 09:26:09

+0

ResultSet rs = sqlStatement.executeQuery(someQuery); rs.next(); rs.getString( 「處理」); – 2015-03-03 09:33:07

+0

像這樣:嘗試ResultSet resuse = DoQuery(「SELECT KEY FROM TABLE WHERE KEY IN('KEY1','KEY2')AND ROWNUM = 1」); resuse.next(); variable = resuse.getString(「KEY」); (); + e.toString()+「 - 」+ e.getSQLState();返回「不能收集關鍵字:」+ e.toString()+「 - 」+ e.getSQLState(); } – OddDev 2015-03-03 09:34:08

1

是的,來自ResultSet API:ResultSet對象維護一個指向其當前數據行的遊標。最初光標位於第一行之前。下一個方法將光標移動到下一行

0

來自官方的JavaDoc: -

從當前位置向前一行移動光標。結果集遊標最初位於第一行之前;下一個方法的第一個調用使第一行成爲當前行;第二次調用使第二行成爲當前行,依此類推。

當對下一個方法的調用返回false時,光標位於最後一行之後。任何需要當前行的ResultSet方法的調用都將導致拋出SQLException。如果結果集類型爲TYPE_FORWARD_ONLY,那麼供應商指定它們的JDBC驅動程序實現是否將返回false,或者在隨後調用next時拋出SQLException。

如果輸入流對當前行打開,則對下一個方法的調用將隱式關閉它。讀取新行時會清除ResultSet對象的警告鏈。

0

其實Resultset.next()未提取的誤差來說明你不叫明確說的就是你這樣寫你的問題將得到解決 首先是檢查resltset爲空或不是

if(rs!=null){ 
while(rs.next()){ 
-------process the results 
}//while loop 
}//if