从H2-数据库获取SqlRowSet对象之后,在使用SqlRowSet.getDouble();从行中检索数据之前,我调用SqlRowSet.next();

我尝试做while(SqlRowSet.next()){},但这不是必需的,因为我总是只有1行数据。

public SqlRowSet findBySkuSize(String sku, String size) {
    return jdbcTemplate.queryForRowSet("SELECT * from PRODUCT_DIMENSIONS where SKU = '" + sku + "' and SIZE = '" + size + "'");
}


上面的方法填充了SqlRowSet对象(在调试器中,我可以看到下图中显示了1行。

        if(CountRows(dimensionResults) < 1)
        {

        }
        else
        {
            dimensionResults.next();
            someObject.objectSetterMethod(dimensionResults.getDouble("DEPTH"));

        }


上面的代码抛出了InvalidCursorException
我猜堆栈跟踪太长,无法粘贴,但这是错误消息

Caused by: java.sql.SQLException: Invalid cursor position
at com.sun.rowset.CachedRowSetImpl.next(CachedRowSetImpl.java:1460)
at org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet.next(ResultSetWrappingSqlRowSet.java:697)
... 67 more

org.springframework.jdbc.InvalidResultSetAccessException: Invalid cursor position; nested exception is java.sql.SQLException: Invalid cursor position
at org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet.next(ResultSetWrappingSqlRowSet.java:700)
at com.footlocker.commerce.shipping.service.FreightCalculationService.UpdateProductDimensions(FreightCalculationService.java:72)
at com.footlocker.commerce.shipping.service.FreightCalculationService.UpdateProductList(FreightCalculationService.java:50)
at com.footlocker.commerce.shipping.service.FreightCalculationService.ProcessFreightCalculationRequest(FreightCalculationService.java:41)
at com.footlocker.commerce.shipping.controller.FreightController.Test(FreightController.java:34)


java - 如何在Java中的SqlRowSet.Next()上修复&#39;无效的Cursor SQL异常&#39;-LMLPHP

由于某种原因,它告诉我我的cursorPosition为2?它应该从0开始吗?如果我只有1行,怎么可能是2。

编辑:我能够将调试器菜单中的光标位置从2更改为0,然后将DimensionResults.next();更改为0。起作用了。为什么为什么当我实例化对象时它从光标位置2开始呢?我对为什么Java与C#相比如此复杂感到十分困惑,并且很难找到使一切都变得有意义的资源。

最佳答案

显然,您的CountRows方法将您带到结果集的末尾。

在这种情况下,您可能想调用beforeFirst()返回到结果集的初始位置。

cf. how to reset the result set to the first row after looping through a while loop

同样,您的位置2是浏览resulset之后的位置,这是“最后一个”位置,与调用afterLast()之后的位置相同。

最后,您可能想看看以下问题:
How do I get the size of a java.sql.ResultSet?

关于java - 如何在Java中的SqlRowSet.Next()上修复'无效的Cursor SQL异常',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54201989/

10-09 05:29