gpt4 book ai didi

java - HSQLDB 从 JDBC 结果集中删除行

转载 作者:行者123 更新时间:2023-11-30 04:28:42 25 4
gpt4 key购买 nike

我在尝试将现有 JDBC 应用程序转换为使用 HSQLDB 版本 2.2.9 时遇到了一些问题(目前代码库在 MySQL、ORACLE 和 SQLServer 上成功运行,但嵌入式数据库似乎也是一个不错的选择) .

我将一次一个地单独提出问题(尽管它们都与自 HSQLDB 2.0 起支持的 JDBC ResultSet.deleteRow() 方法相关)

为什么调用rs.deleteRow()rs.next()返回false?

这是一个完整的自包含代码示例(包括简单的表创建、示例插入和最后删除表):

    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 行被删除:

Deleting row:0

Deleting row:7

...

Deleting row: 98

在 HSQLDB 上,输出为:

Deleting row:0

第一次调用 rs.deleteRow() 后,rs.next() 返回 false。

我在 HSQLDB javadoc 中找不到任何信息。有人有什么想法吗?

最佳答案

正如我之前评论过的,这听起来像是 HSQLDB JDBC 实现中的一个错误。 JDBC 4.1 规范(第 15.2.4.2 节)说:

After the method deleteRow has been called, the cursor will be positioned before the next valid row. If the deleted row is the last row, the cursor will be positioned after the last row.

这意味着对 next() 的调用应该返回 true(如果 ResultSet 包含更多行)。

关于java - HSQLDB 从 JDBC 结果集中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15159170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com