在ResultSet中不允许updateLong

时间:2013-12-05 22:02:49

标签: java sql jdbc resultset derby

我正在尝试在表格中添加序列号。这是我的方法:

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的错误,而我的结果集已经设置为可更新。 我正在使用德比数据库。

3 个答案:

答案 0 :(得分:2)

根据javadoc

static final int TYPE_SCROLL_SENSITIVE

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

您正在寻找的可能是:

static final int TYPE_SCROLL_INSENSITIVE

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

答案 1 :(得分:1)

根据Derby DocumentationORDER BY的查询无法更新:

  

只有简单的单表SELECT游标才可以更新。可更新ResultSets的SELECT语句与可更新游标的SELECT语句具有相同的语法。要生成可更新游标:

     
      
  • SELECT声明不得包含ORDER BY条款。
  •   
  • 基础查询必须是SelectExpression。
  •   
  • 基础查询中的SelectExpression不得包含:   
        
    • DISTINCT
    •   
    • 聚集体
    •   
    • GROUP BY条款
    •   
    • HAVING条款
    •   
    • ORDER BY条款
    •   
  •   
  • 基础查询中的FROM子句不得:   
        
    • FROM子句中的多个表
    •   
    • 除了一个表名之外的任何内容
    •   
    • SelectExpressions
    •   
    • 子查询
    •   
  •   
  • 如果基础查询具有WHERE子句,则WHERE子句不得包含子查询。
  •   

换句话说,你不能包括ORDER BY,但这会破坏你的目的(因为你似乎在重新编号某些标识符)。

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


Derby还有does not support TYPE_SCROLL_SENSITIVE个结果集。根据文档,Derby支持:

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

答案 2 :(得分:0)

不确定您的SQL的特殊风格,但是如何在单个更新语句中而不是读取+更新中执行此操作,如下所示:

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