我正在尝试在表格中添加序列号。这是我的方法:
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
的错误,而我的结果集已经设置为可更新。
我正在使用德比数据库。
答案 0 :(得分:2)
根据javadoc
static final int TYPE_SCROLL_SENSITIVE
常量指示可滚动的ResultSet对象的类型,通常对ResultSet的基础数据的更改敏感。
您正在寻找的可能是:
static final int TYPE_SCROLL_INSENSITIVE
该常量指示ResultSet对象的类型,该对象可滚动但通常对对ResultSet 构成的数据的更改不敏感。
答案 1 :(得分:1)
根据Derby Documentation,ORDER 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)