0

可能重复:
rs.last() 为仅转发结果集提供无效操作:最后

因此,我试图了解结果集光标,但显然光标所在的位置存在问题。

我有一个非常小的应用程序,它自动分配一个新的整数 id,这将是数据库的最后一个条目,因此是最高的整数。我正在尝试像这样进入最后一个条目(rs 是结果集),所以我可以使用它的值:

rs.last

然后将 the_new_id 分配给 rs.getInt(1)...

但是,我得到“仅转发结果集的无效操作:最后一个”sql 异常。

现在我有一个很大的“kludge”来完成这项工作:

  while(rs.next())
       your_new_id = rs.getInt(1);

然后我就这样分配新的ID。:-\

如何使用 last 更优雅地实现相同的行为?

任何帮助表示赞赏。

4

2 回答 2

1

默认情况下,结果集是只向前的,这意味着您唯一可以更改光标位置的方法是next()(如果您按 ID 降序排序,这就是您所需要的)。

javadoc对此进行了解释:

默认的 ResultSet 对象是不可更新的,并且有一个只能向前移动的光标。因此,您只能遍历它一次,并且只能从第一行到最后一行。可以生成可滚动和/或可更新的 ResultSet 对象。下面的代码片段,其中 con 是一个有效的 Connection 对象,说明了如何创建一个可滚动的、对其他人的更新不敏感且可更新的结果集。有关其他选项,请参阅 ResultSet 字段。

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                     ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
// rs will be scrollable, will not show changes made by others,
// and will be updatable
于 2012-11-20T08:05:59.897 回答
1

显然,您正试图检索上一条INSERT语句生成的 ID。您不应该为此使用单独的SELECT语句(这不是事务安全的,并且会给数据库带来不必要的负载)。

要检索生成的 ID,请使用以下 JDBC 调用:

String insert = "insert into some_table (... ";
PreparedStatement pstmt = con.prepareStatement(insert, new String[] {"ID"});
int rowsInserted = pstmt.executeUpdate();
ResultSet idResult = pstmt.getGeneratedKeys();
int newId = -1;
if (rs.next()) {
  newId = rs.getINt(1);
}

ID这将检索在 INSERT 期间为列生成的值。这将比SELECT获取最新 ID 更快,但更重要的是它是交易安全的。

于 2012-11-20T09:22:03.083 回答