获得 SQLException java.sql.SQLException: ResultSet.next 未被调用

8

我目前正在开发一个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"!
提前感谢!
4个回答

15

您必须先调用“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文档指出:

初始时光标位于第一行之前。


如果我在首次调用next()时会得到一个布尔值,因此无法调用"getString"方法。 - OddDev
ResultSet rs = sqlStatement.executeQuery(someQuery); rs.next(); rs.getString("HANDLE");结果集 rs = sqlStatement.executeQuery(someQuery); rs.next(); rs.getString("HANDLE"); - Alibek Beldinov
尝试这样写: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 "无法获取密钥:" + e.toString() + " - " + e.getSQLState(); } - OddDev

1

是的,可以使用ResultSet API实现:ResultSet对象维护一个光标指向其当前数据行。最初,光标位于第一行之前。next方法将光标移动到下一行。


0

实际上,Resultset.next() 没有提取错误的意思是你没有显式地调用它,如果你像这样编写代码,你的问题将得到解决。首先检查 resltset 是否为空。

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

0

来自官方JavaDoc:

将光标从当前位置向前移动一行。 ResultSet光标最初定位在第一行之前;第一次调用next方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。

当调用next方法返回false时,光标定位在最后一行之后。任何需要当前行的ResultSet方法的调用都会导致抛出SQLException异常。如果结果集类型为TYPE_FORWARD_ONLY,则由供应商指定其JDBC驱动程序实现是否在随后调用next时返回false或抛出SQLException。

如果为当前行打开了输入流,则对方法next的调用将隐式关闭它。读取新行时,ResultSet对象的警告链将被清除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接