我正试图在表中添加一个序列号。这是我的方法:
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)