【问题标题】:updateLong not allowed in ResultSetResultSet 中不允许 updateLong
【发布时间】:2013-12-23 02:04:06
【问题描述】:

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

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

【问题讨论】:

    标签: java sql jdbc resultset derby


    【解决方案1】:

    根据javadoc

    static final int TYPE_SCROLL_SENSITIVE
    

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

    您正在寻找的可能是:

    static final int TYPE_SCROLL_INSENSITIVE
    

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

    【讨论】:

    • 对不起。但没有效果。
    • @PranjalCholadhara:请解释“但没有效果”。更新完整的异常堆栈。
    • @PranjalCholadhara:这可能会帮助你(如果你还没有提到)db.apache.org/derby/docs/10.8/devguide/cdevconcepts28351.html
    • 我将其更改为“TYPE_SCROLL_INSENSITIVE”。但我得到了同样的信息。如果我从查询中删除“ORDER BY”,它工作正常。但我无法删除“ORDER BY”来满足我的逻辑。
    • @PranjalCholadhara:请参阅上面的链接和德比手册中的“更新”条款。似乎有一些限制。
    【解决方案2】:

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

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

    【讨论】:

    • 但我的序列号应该始终是日期。
    【解决方案3】:

    根据Derby Documentation,带有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 还有does not support TYPE_SCROLL_SENSITIVE 结果集。根据文档,Derby 支持两者:

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

    【讨论】:

    • 很有用。我必须编写两个查询,因为我必须使用“ORDER BY”。
    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 2017-04-17
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    相关资源
    最近更新 更多