既存のJDBCアプリケーションをHSQLDBバージョン2.2.9を使用するように変換しようとしたときに、いくつかの問題が発生しました(現在、コードベースはMySQL、ORACLE、およびSQLServerで正常に実行されますが、組み込みデータベースも適切なオプションのようです)。
一度に1つずつ、個別に質問します(ただし、これらはすべてJDBCResultSet.deleteRow()
メソッドに関連しており、HSQLDB 2.0以降でサポートされています)。
rs.next()
呼び出した後にfalseを返すのはなぜrs.deleteRow()
ですか?
完全な自己完結型のコードサンプルを次に示します(単純なテーブルの作成、サンプルの挿入、最後のテーブルの削除を含む)。
int deletedRows=0;
try{
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:mytestdb",
"SA", "");
String createSQL =
"create table test (num INTEGER PRIMARY KEY, str VARCHAR(25))";
Statement createStmt = c.createStatement();
createStmt.execute(createSQL);
createStmt.close();
String ins = "insert into test (num,str) values (?,?)";
PreparedStatement pStmt = c.prepareStatement(ins);
for(int i=0; i<100; i++){
pStmt.setInt(1, i);
pStmt.setString(2, "String"+i);
pStmt.execute();
}
// there should now be 100 rows in the table
String select = "SELECT * FROM test";
PreparedStatement stmt = c.prepareStatement(select,
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery();
rs.beforeFirst();
while(rs.next()){
int num = rs.getInt("num");
if((num%7)==0){
System.out.println("Deleting row:"+num);
rs.deleteRow();
deletedRows++;
}
}
Statement dropStmt = c.createStatement();
dropStmt.execute("drop table test;");
dropStmt.close();
} catch (SQLException sqle) {
System.out.println("Deleted "+deletedRows+
" rows before exception: "+sqle.getMessage());
sqle.printStackTrace();
}
MySQLデータベースで同じコードを実行すると、7行ごとに削除されることが出力に示されます。
行の削除:0
行の削除:7
..。
行の削除:98
HSQLDBでは、出力は次のとおりです。
行の削除:0
へのrs.next()
最初の呼び出しの後、falseを返しますrs.deleteRow()
。
HSQLDBjavadocに情報が見つかりません。誰かアイデアはありますか?