JDBC ResultSet行为奇怪

时间:2011-08-19 14:36:15

标签: java sql jdbc resultset

我正在访问我的数据库并获得一个ResultSet,告诉我当前行#是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); }

我今天早上花了近一个小时试图弄清楚发生了什么,但这是我试图执行的文字代码(它是一个测试/沙箱项目,所以它可能不会使逻辑

2 个答案:

答案 0 :(得分:2)

标准JDBC库返回一个ResultSet,它不知道其中有多少行。除非你的executeSQL实现返回一个CachedRowSet(它实际上已经预先滚动了结果集并将所有行加载到内存中),否则你永远不会知道行数,直到你结束时oResults.next()返回false。

因此,您通过检查行计数来控制程序流的尝试将无法工作。

接下来,您对ResultSet.getRow()的来电也可能毫无用处。以下是javadoc所说的内容:

  

检索当前行号。第一行是数字1,第二行是数字2,依此类推   注意:对于结果集类型为TYPE_FORWARD_ONLY

的ResultSet,对getRow方法的支持是可选的

JDBC驱动程序中的大多数实现都只是向前的(即你不能通过previous()方法向后滚动),因此getRow()的结果可能没用。

以下是您的代码应该是什么样的:

ResultSet oResults = executeSQL("SELECT * FROM widgets");

while(oResults.next())
{
    // Process rows
}

如果你还没有进入while循环,这意味着你的查询没有返回任何行 - 没有其他解释。如果没有行是“不可能的”,那么我建议你检查你的连接参数,以确保你连接到正确的数据库(例如,不是localhost)。

答案 1 :(得分:1)

方法getRow()允许您检查光标当前所在行的编号,因此对next()的调用超出了结果集的范围。设置iRowCount后尝试设置oResults.absolute(0);