0

重複の可能性:
rs.last() は、前方のみの結果セットに対して無効な操作を提供します: last

そのため、結果セットのカーソルを理解しようとしていますが、カーソルが明らかにどこにあるかに問題があります。

新しい整数 ID を自動的に割り当てる非常に小さなアプリケーションがあります。これはデータベースへの最後のエントリになるため、最大の整数になります。このような最後のエントリに到達しようとしています (rs は結果セットです) ので、その値を使用できます。

rs.last

そして、the_new_id を rs.getInt(1) に割り当てます...

ただし、「転送のみの結果セットに対する無効な操作: 最後」の sql 例外が発生します。

今、私はこれを機能させるための大きな「クラッジ」を持っています:

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

そして、新しいIDをそのように割り当てます。:-\

最後を使用して、この同じ動作をよりエレガントに実装するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

2 に答える 2

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 に答える
1

デフォルトでは、結果セットは前方のみです。つまり、カーソルの位置を変更するためにできる唯一のことはnext()(ID で降順で並べ替える場合に必要なすべてです)。

javadoc では次のように説明されています。

デフォルトの ResultSet オブジェクトは更新可能ではなく、前方にのみ移動するカーソルがあります。したがって、最初の行から最後の行まで 1 回だけ繰り返すことができます。スクロール可能および/または更新可能な 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 に答える