JDBC アプリケーションで ResultSet の現在行が削除ホールまたは更新ホールになっているかどうかをテストする
ResultSet に TYPE_SCROLL_SENSITIVE 属性があり、基礎になっているカーソルが SENSITIVE STATIC の場合は、ResultSet の行を取得する前に、削除ホールまたは更新ホールがあるかどうかをテストする必要があります。
このタスクについて
SENSITIVE STATIC の ResultSet を開いた後も、サイズ変更はありません。 削除された行は、プレースホルダーに置き換えられているからです。そのような行のことをホール といいます。 更新された行が ResultSet の基準に適合しなくなった場合も、ホールになります。 ホールになった行を取得することはできません。
プロシージャー
ResultSet の現在行が削除ホールまたは更新ホールになっているかどうかをテストするには、以下の手順を実行します。
- DatabaseMetaData.deletesAreDetected または DatabaseMetaData.updatesAreDetected メソッドをTYPE_SCROLL_SENSITIVE引数とともに呼び出し、データソースがTYPE_SCROLL_SENSITIVE ResultSet 用の穴を作成しているかどうかを判断します。
- DatabaseMetaData.deletesAreDetected または DatabaseMetaData.updatesAreDetected が
trueを返した場合、データソースに穴が生じていることを意味します。 ResultSet.rowDeleted または ResultSet.rowUpdated メソッドを呼び出して、現在の行が削除の穴なのか更新の穴なのかを判断します。メソッドからtrueが返された場合、現在行はホールです。
例
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// Create a Statement object
// for a scrollable, updatable
// ResultSet
ResultSet rs =
stmt.executeQuery("SELECT EMPNO FROM EMPLOYEE FOR UPDATE OF PHONENO");
// Create the ResultSet
DatabaseMetaData dbmd = con.getMetaData();
// Create the DatabaseMetaData object
boolean dbSeesDeletes =
dbmd.deletesAreDetected(ResultSet.TYPESCROLL_SENSITIVE);
// Can the database see delete holes?
rs.afterLast(); // Position the cursor at the end of
// the ResultSet
while (rs.previous()) { // Position the cursor backward
if (dbSeesDeletes) { // If delete holes can be detected
if (!(rs.rowDeleted())) // If this row is not a delete hole
{
s = rs.getString("EMPNO"); // Retrieve the employee number
System.out.println("Employee number = " + s);
// Print the column value
}
}
}
rs.close(); // Close the ResultSet
stmt.close(); // Close the Statement