Sql &引用;“乱七八糟”;JDBC中结果集的定义

Sql &引用;“乱七八糟”;JDBC中结果集的定义,sql,jdbc,db2,resultset,Sql,Jdbc,Db2,Resultset,可能重复: 所以我试图理解结果集游标,我对游标的位置有一个问题 我有一个非常小的应用程序,它自动分配一个新的整数id,它将是数据库的最后一个条目,因此是最高的整数。我试图像这样得到最后一个条目(rs是结果集),以便使用它的值: 拉斯特 然后将_new_id分配给rs.getInt(1) 但是,我得到了“仅转发resultset:last的无效操作”sql异常 现在我有一个很大的“难题”来解决这个问题: while(rs.next()) your_new_id = rs.get

可能重复:

所以我试图理解结果集游标,我对游标的位置有一个问题

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

拉斯特

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

但是,我得到了“仅转发resultset:last的无效操作”sql异常

现在我有一个很大的“难题”来解决这个问题:

  while(rs.next())
       your_new_id = rs.getInt(1);
然后我就这样分配新的id:-\

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


非常感谢您的帮助。

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

解释如下:

默认的ResultSet对象是不可更新的,并且具有 只向前移动。因此,您只能在其中迭代一次 仅从第一行到最后一行。生产是可能的 可滚动和/或可更新的ResultSet对象。以下 代码片段(其中con是有效的连接对象)说明了 如何创建可滚动且对更新不敏感的结果集 由其他人,这是可更新的。有关其他信息,请参见结果集字段 选项

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

显然,您正在尝试检索由以前的
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
列生成的值。这将比执行
选择
获取最新ID更快,但更重要的是它是事务安全的

这不安全。如果有人在中间插入呢?您将无法获得最新的信息大多数数据库都有一种生成用于合成键字段的唯一值的方法。在db2中,我认为应该使用Good point Hrdik,我已经考虑过这一点。然而,这是唯一一个进行插入的地方。所以现在可以保证不会造成任何问题。@Lee Right,我确实使用了一个序列来实现增量。如果您使用的是序列,您应该使用
getGeneratedKeys()
来获取在
插入过程中生成的ID
。这样可以节省大量往返数据库的时间。