【问题标题】:Invalid operation for read only resultset: updateString只读结果集的无效操作:updateString
【发布时间】:2013-09-19 05:35:24
【问题描述】:

以下是我的代码(重新构建),它根据条件选择和更新 STATUS 字段。 (使用 Servlet、Oracle 作为后端和 JDBC 驱动程序)

ResultSet rs=null;
String query = "select A.NAME, A.ADDRESS, A.STATUS, B.CLASS from TABLE_ONE A, TABLE_TWO B where A.STATUS='N'";
pstmt = con.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = pstmt.executeQuery();
while(rs.next())
{
    String name = rs.getString("NAME");
    String address = rs.getString("ADDRESS");
    String class = rs.getString("CLASS");

    String msg = //Other statements to check what status to be set

    if(msg.equals("OK"))
        rs.updateString("STATUS", "S");
    else
        rs.updateString("STATUS", "E");
    rs.updateRow();
}

更新时出现错误:

java.sql.SQLException: Invalid operation for read only resultset: updateString

任何建议将不胜感激。

更新 1: select语句从单个表中选择数据时,相同的代码正在工作,那么在单个查询中从两个表中选择数据时有什么问题吗?

[注意:正如@javaBeginner 在 cmets 中提到的,它只适用于一个表。]

【问题讨论】:

  • 试试这个:rs.moveToInsertRow(); rs.updateString("STATUS", "S"); rs.insertRow(); 代替 rs.updateString("STATUS", "S"); 我不确定...请检查并告诉我
  • @bhushan rs 是 instanceOf 什么。那可能是只读的。
  • @RakeshJuyal 我已将 rs 声明为 `ResultSet rs=null'
  • @Bhushan 将您的查询更改为 select * from table_one 并让我知道它是否有效
  • @Bhushan 它只适用于一张桌子,请查看 jdbc api 2.2 第 5.6 节

标签: java sql oracle jdbc


【解决方案1】:

对增强结果集的查询有以下限制。不遵循这些准则将导致 JDBC 驱动程序选择替代结果集类型或并发类型。

生成可更新的结果集(来自规范):

  • 查询只能从单个表中进行选择,并且不能包含任何连接操作。

此外,为了使插入可行,查询必须选择所有不可为空的列和所有没有默认值的列。 * 查询不能使用“SELECT *”。 (但请参阅下面的解决方法。) * 查询只能选择表列。它不能选择派生列或聚合,例如一组列的 SUM 或 MAX。

要生成滚动敏感的结果集:

  • 查询不能使用“SELECT *”。 (但请参阅下面的解决方法。)
  • 一个查询只能从一个表中进行选择。

【讨论】:

    【解决方案2】:

    试试这个:

     Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    
    //Execute a query
     String sql = "select A.NAME, A.ADDRESS, A.STATUS, B.CLASS from TABLE_ONE A, TABLE_TWO B where A.STATUS='N'";
     ResultSet rs = stmt.executeQuery(sql);
    //Extract data from result set
      rs.beforeFirst();
    while(rs.next())
    {
        String name = rs.getString("NAME");
        String address = rs.getString("ADDRESS");
        String class = rs.getString("CLASS");
    
        String msg = //Other statements to check what status to be set
    
        if(msg.equals("OK"))
            rs.updateString("STATUS", "S");
        else
            rs.updateString("STATUS", "E");
        rs.updateRow();
    }
    

    只是将 Prepared statement 改为 create statement

    【讨论】:

    • 感谢您的回答,我已经尝试过您的代码,但即使使用 Statement 我也遇到了同样的错误。
    • @Bhushan 如果您能提供表格架构和代码,这将对我们有所帮助
    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2012-12-31
    • 2013-02-20
    • 2022-11-14
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多