【问题标题】:Problems with ResultSet结果集的问题
【发布时间】:2014-05-16 22:21:17
【问题描述】:

看看下面的代码。这里的问题是查询返回一个没有行的列(LOGIN)(这就是 SQL Developer 所说的),正在执行 rs.next() 并且 rs.getString(1) 从表用户返回第一行。我不明白 ResultSet 中的 currentRow 字段下的值为 -1 的事实。这意味着它从查询中获得了一行,这是一个大规模的不连贯性。如果没有返回行,我应该如何强制 next() 方法不要前进?

ResultSet rs = null;
String name = null;
Statement stat = db.conn.createStatement();
String query = "SELECT Users.LOGIN FROM Users, Accessibility WHERE Accessibility.Users_IDGRANTING=4 AND Users.ID=Accessibility.Users_IDRECEIVING";
rs = stat.executeQuery(query);

while(rs.next()) 
{
name = rs.getString(1);
}

【问题讨论】:

  • 你试过打印rs.getString(1)的内容吗?您可能正在测试中连接到另一个数据库。
  • 名称包含 getString(1) 中的内容。它是表用户中的第一条记录,第一列。我没有其他数据库。
  • 我怕问ResultSet是不是被某个Statement返回的:-)
  • 对不起,我的错。我刚刚编辑了代码。
  • 您是否正在运行发布的代码(完全如图所示)?

标签: java sql


【解决方案1】:

“如果没有返回行,我应该如何强制 next() 方法不前进?”
这就是它的作用,在这种情况下 rs.next() 将是错误的。

【讨论】:

  • 正如我所说,SQL Developer 对提到的查询做出反应(我实际上是从调试模式复制查询) - 没有行,只有一列可用。我以这种方式发布的代码。 rs { currentRow=-1 fetchedRowCount=1, maxRows=0 } 并且 rs.next() 不返回 false。它返回一行。我不知道为什么。
  • 尝试使用PreparedStatement 看看是否能解决问题。您在此处显示的代码应该可以正常工作。
【解决方案2】:

ResultSet 的光标最初位于第一条记录之前。因此,如果rs 为空,则rs.next() 将立即返回false,并且您的while 循环将立即退出。只需检查您的 rs 是否由其他语句创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 2011-04-04
    • 1970-01-01
    • 2016-11-29
    • 2022-06-16
    • 2011-12-15
    • 1970-01-01
    • 2019-09-11
    相关资源
    最近更新 更多