仕様書 翻訳追加

ResultSet.updateNString/updateNCharacterStream/updateNClobを追加実装するにあたって,念のため仕様書を熟読してみた.参考にはなった.



16. 結果セット

ResultSetインタフェースはクエリの実行結果の取得と操作のためのメソッドを提供します.
16.2. ResultSetオブジェクトの生成と操作
16.2.4. ResultSetオブジェクトの変更

同時実行レベルに"CONCUR_UPDATABLE"を設定したResultSetオブジェクトはメソッドを使用して更新することができます.ResultSetインタフェースで定義されたメソッドを使うことでカラムの値の更新,新しい行の挿入,行の削除を行えます.
16.2.4.1. 行の更新

ResultSetオブジェクトの中にある行の更新処理は2つのフェーズに分けて段階的に行います.まず各カラムへの新しい値を設定し,その後その変更を行へ適用します.データソースに実際に存在する行データはこの2つ目のフェーズが完了するまで更新されません.

ResultSetインタフェースには各JDBCのデータ型に対してそれぞれ2つのメソッドが定義されています.1つはカラムをインデックスで指定するもの,もう1つはSELECT時に使用したカラム名で指定するものです.

この更新用メソッドに指定するカラム名は大文字と小文字の区別を行いません.もしSELECT時に使用したカラム名に,大文字と小文字を区別しない場合に同じカラム名となるものが2つ以上存在する場合には,最初に該当するカラムが更新されることになります.

更新用メソッドが呼ばれたResultSetの同時実行レベルがResultSet.CONCUR_READ_ONLYである場合には,SQLExceptionがスローされます.

updateRowメソッドは全てのカラムの変更を現在の行に適用し,それ以前に行われた変更をクリアします.updateRowメソッドが呼ばれるまで,変更は反映されません.更新用メソッドが呼ばれたResultSetの同時実行レベルが ResultSet.CONCUR_READ_ONLYである場合には,SQLExceptionがスローされます.同時実行レベルが ResultSet.CONCUR_UPDATABLEに設定されても変更が何も行われていない状態でupdateRowメソッドが呼ばれた場合,このメソッドは何も処理をしません.

cancelUpdatesメソッドを使用することでupdateRowメソッドが呼ばれる前の元の状態に戻すことができます.コード例 16-5 は現在の行のカラム"author"の値を"Zamyatin, Evgenii Ivanovich"に変更する場合の例です.

Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
                                      ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(“select author from booklist " +
                                  "where isbn = 140185852”);
rs.next();
rs.updateString(“author”, “Zamyatin, Evgenii Ivanovich”);
rs.updateRow();

コード例 16-5 ResultSetオブジェクトの行を更新

DatabaseMetaData.ownUpdatesAreVisible(int type)メソッドは,それぞれ引数で指定したタイプのResultSetオブジェクトから自身の更新を見ることが出来る場合にはtrueを返し,そうでない場合にはfalseを返します.

ResultSetオブジェクトはrowUpdatedメソッドを使うことでupdateRowメソッドがそのオブジェクトに対して呼ばれたか否かを確認することができるかもしれません.DatabaseMetaData.updatesAreDetected(int type)メソッドは,それぞれ引数で指定したタイプのResultSetオブジェクトがrowUpdatedメソッドで更新を確認できる場合には true,そうでない場合にはfalseを返します.

http://ikda.net/fswiki/wiki.cgi?page=JDBC+4%2E0+%BB%C5%CD%CD%BD%F1