首页 > 解决方案 > 如何在 Java 中修复 SqlRowSet.Next() 上的“无效游标 SQL 异常”

问题描述

从 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)

调试器

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

编辑:我能够将调试器菜单中的光标位置从 2 更改为 0 和 dimensionResults.next(); 工作.. 那么为什么当我实例化对象时它从光标位置 2 开始?我非常困惑为什么 Java 与 C# 相比必须如此复杂,并且找到资源来理解一切也很困难,哈哈。

标签: javaspringspring-jdbc

解决方案


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

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

参看。循环通过while循环后如何将结果集重置为第一行

此外,您的位置2是浏览结果集后您所在的位置,这是“最后一个”位置,与您在调用后的位置相同afterLast()

最后,您可能想看看以下问题: 如何获得 java.sql.ResultSet 的大小?


推荐阅读