如何在 Java 中的 SqlRowSet.Next() 上修复 'Invalid Cursor SQL Exception'
How to fix 'Invalid Cursor SQL Exception' on SqlRowSet.Next() in Java
从 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# 相比必须如此复杂,而且找到资源来理解所有内容也很困难,哈哈。
显然,您的 CountRows
方法会将您带到结果集的末尾。
在这种情况下,您可能需要调用 beforeFirst()
返回到结果集的初始位置。
比照。 how to reset the result set to the first row after looping through a while loop
另外你的位置 2
是你在浏览结果集后的位置,这是 "after last" 的位置,与你调用 afterLast()
后的位置相同。
最后,您可能想看看以下问题:
How do I get the size of a java.sql.ResultSet?
从 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# 相比必须如此复杂,而且找到资源来理解所有内容也很困难,哈哈。
显然,您的 CountRows
方法会将您带到结果集的末尾。
在这种情况下,您可能需要调用 beforeFirst()
返回到结果集的初始位置。
比照。 how to reset the result set to the first row after looping through a while loop
另外你的位置 2
是你在浏览结果集后的位置,这是 "after last" 的位置,与你调用 afterLast()
后的位置相同。
最后,您可能想看看以下问题: How do I get the size of a java.sql.ResultSet?