一尘不染

ResultSet中不允许使用updateLong

sql

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

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数据库。


阅读 162

收藏
2021-03-10

共1个答案

一尘不染

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

只有简单的单表SELECT游标才可以更新。可更新ResultSet的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_SCROLL_INSENSITIVE因为您仅将其作为转发处理。

2021-03-10