java - JDBC 结果集行为异常

标签 java sql jdbc 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); }

今天早上我花了将近一个小时试图弄清楚发生了什么,但这是我试图执行的文字代码(这是一个测试/沙盒项目,所以它可能不合逻辑 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/

相关文章:

sql - 如何在 date_trunc 中添加整数变量

Java通过外部类对象引用内部类属性

java - 动态数据源路由 - 数据源路由器未初始化

java - 扩展类时遇到问题(不明白出了什么问题,也不明白该网站上的其他复杂解释。)

java - 与java正则表达式的反向匹配

Python - 将列表作为参数传递给 SQL,以及更多变量

mysql - 在mysql查询中重新输入别名列

java - 下划线不正确的 JPA 列

java - JDBC 驱动程序转义准备好的语句的参数?

java ubuntu 中的 java.lang.ClassNotFoundException