web-dev-qa-db-ja.com

SQLException Java.sql.SQLExceptionを取得します:ResultSet.nextは呼び出されませんでした

現在、Webサービスを開発しています。最初の本番バージョンをリリースする準備ができていると思いましたが、意味のないSQLExceptionが発生し続けます。私はOracleデータベースに対して開発しています。最初に私のコードを紹介しましょう:

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」を実行する必要があるのか​​本当にわかりません。

前もって感謝します!

7
OddDev

結果セットのカーソルを最初の行に設定するには、「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ドキュメント の状態:

最初、カーソルは最初の行の前に置かれます。

14
Alibek Beldinov

はい、ResultSet APIから:ResultSetオブジェクトは、現在のデータ行を指すカーソルを維持します。最初、カーソルは最初の行の前に置かれます。次のメソッドは、カーソルを次の行に移動します

1

公式JavaDocから:-

カーソルを現在の位置から1行前に移動します。 ResultSetカーソルは、最初は最初の行の前に配置されます。次にメソッドを最初に呼び出すと、最初の行が現在の行になります。 2番目の呼び出しは、2番目の行を現在の行にします。

次のメソッドの呼び出しがfalseを返す場合、カーソルは最後の行の後に配置されます。現在の行を必要とするResultSetメソッドを呼び出すと、SQLExceptionがスローされます。結果セットのタイプがTYPE_FORWARD_ONLYの場合、JDBCドライバーの実装がfalseを返すか、nextへの後続の呼び出しでSQLExceptionをスローするかはベンダーが指定します。

現在の行に対して入力ストリームが開いている場合、nextメソッドを呼び出すと、暗黙的にその行が閉じられます。 ResultSetオブジェクトの警告チェーンは、新しい行が読み取られるとクリアされます。

0
s4ik4t

実際には、Resultset.next()抽出されないエラーが発生するということは、明示的に呼び出さないことを意味します。つまり、このように書くと、まず問題が解決されます。resltsetがnullかどうかを確認してください。

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