我正在访问我的数据库并获得一个结果集,该结果集告诉我当前行 # 是 2 调用 getRow(),但是当我调用 next() 方法时它无法循环:
// Doesn't even loop once; fails on initial next() call -- entire loop skipped
try
{
ResultSet oResults = executeSQL("SELECT * FROM widgets");
// Returns a value of 2
int iRowCount = oResults.getRow();
if(iRowCount == 0)
return;
while(oResults.next())
{
// Never gets executed
}
// This gets executed though, and all the way down...
// ...
}
catch(Exception e) { handleException(e); }
今天早上我花了将近一个小时试图弄清楚发生了什么,但这是我试图执行的文字代码(这是一个测试/沙盒项目,所以它可能不合逻辑 em>感觉)。有人遇到过这种情况吗?
最佳答案
标准 JDBC 库返回一个 ResultSet
,它不知道其中有多少行。除非您的 executeSQL
实现返回 CachedRowSet (它基本上已经预先滚动了结果集并将所有行加载到内存中),直到你在 oResults.next() 结束时你永远不会知道行数。返回 false。
因此,您通过检查行数来控制程序流的尝试将永远行不通。
接下来,您调用 ResultSet.getRow()也可能没用。这是 javadoc 所说的内容:
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note: Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
大多数 JDBC 驱动程序的实现都是向前的(即您不能通过 previous() 方法向后滚动),因此 getRow()
的结果可能没有用。
您的代码应该如下所示:
ResultSet oResults = executeSQL("SELECT * FROM widgets");
while(oResults.next())
{
// Process rows
}
如果您仍然没有进入 while 循环,则意味着您的查询未返回任何行 - 没有其他解释。如果没有任何行是“不可能的”,那么我建议您检查您的连接参数以确保您连接到正确的数据库(例如,而不是本地主机)。
关于java - JDBC 结果集行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7123163/