在ResultSet中不允许updateLong



我正试图在表中添加一个序列号。这是我的方法:

public void reArrangeTrID(){
String parti = name.getText().toUpperCase();    
long trid = 1;
try{
String query="SELECT LONGDATE, TRID FROM PARTIACCOUNT WHERE PARTY= '"+parti+"' ORDER BY LONGDATE ASC ";
conn = new connection().db();
stmtt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = stmtt.executeQuery(query);
while(rs.next()) {
    long tr = rs.getLong("TRID");
    rs.updateLong("TRID", trid);
    rs.updateRow();
    trid++;
    jLabel9.setText("Arranging transactions... Please wait.");
}
 }
catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Unknown Error!! Data cannot be displayed!"+ex);
}
finally{try{stmtt.close(); rs.close(); conn.close(); }catch(SQLException ex){}}
}

为什么这个方法给我一个错误updateLong not allowed because ResultSet is not an updatable ResultSet,而我的结果集已经设置为可更新。我正在使用derby数据库。

根据javadoc

static final int TYPE_SCROLL_SENSITIVE

指示ResultSet对象的类型的常量,该对象是可滚动的,并且通常对ResultSet下的数据的更改敏感

您正在寻找的可能是:

static final int TYPE_SCROLL_INSENSITIVE

指示ResultSet对象的类型的常量,该对象是可滚动的,但通常对ResultSet基础数据的更改不敏感

根据Derby文档,带有ORDER BY的查询是不可更新的:

只有简单的单表SELECT游标才能更新。可更新结果集的SELECT语句与可更新游标的SELECT语句具有相同的语法。生成可更新光标:

  • SELECT语句不能包含ORDER BY子句
  • 基础查询必须是SelectExpression
  • 基础查询中的SelectExpression不得包含:
    • DISTINCT
    • 骨料
    • GROUP BY条款
    • HAVING条款
    • ORDER BY条款
  • 基础查询中的FROM子句不得具有:
    • FROM子句中有多个表
    • 除了一个表名之外的任何其他名称
    • 选择表达式
    • 子查询
  • 如果基础查询具有WHERE子句,则WHERE子句不得具有子查询

换句话说,您不能包含ORDER BY,但这将违背您的目的(因为您似乎正在重新编号某个标识符)。

您要么需要使用一些查询来重新编号,而不需要在JDBC中进行处理,要么需要使用两个Statement对象,一个用于查询行,另一个用于更新行。


Derby也不支持TYPE_SCROLL_SENSITIVE结果集。根据文档,Derby同时支持以下两种:

  • TYPE_FORWARD_ONLY
  • TYPE_SCROLL_INSENSITIVE

请注意,您当前的代码不需要TYPE_SCROLL_INSENSITIVE,因为您只是将其作为转发处理。

不确定SQL的特定风格是什么,但不如在单个更新语句中执行,而不是像这样的read+update:

UPDATE Sometable
SET col1 =
(SELECT COUNT(*)
FROM Sometable AS S
WHERE keycol <= Sometable.keycol)

相关内容

  • 没有找到相关文章

最新更新