You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ResultSet已设为CONCUR_UPDATABLE仍不可更新,新增数据库行报错求助

解决ResultSet设置CONCUR_UPDATABLE仍不可更新的问题

嘿,我来帮你搞定这个头疼的报错!你明明已经设置了CONCUR_UPDATABLE,却还是收到“ResultSet is not updatable”的提示,大概率是以下几个细节没处理好,咱们逐个排查:

常见问题原因

  • 查询语句不符合可更新ResultSet要求:JDBC对可更新的ResultSet有严格限制,必须满足:

    • 仅查询单个表,不能包含JOIN、UNION、聚合函数(SUM/COUNT等)、DISTINCT关键字
    • 查询的表必须有主键(或唯一约束),驱动需要通过主键定位行来执行更新/插入
      你的语句Select admin.* From admin看起来是单表,但要确认admin表有没有设置主键——如果没有的话,驱动根本没法生成可更新的结果集。
  • JdbcRowSet的并发模式设置无效:你先通过Statement创建ResultSet,再转成JdbcRowSetImpl,这时候JdbcRowSet的并发模式会继承原ResultSet的配置,后续调用regis.setConcurrency(...)根本不会生效。而且这种转译步骤完全没必要,反而容易出问题。

  • 空指针风险的错误判断:代码里的if(!rs12.equals(null))是错的!如果rs12真的是null,调用equals()会直接抛出NullPointerException,正确的判断应该是if(rs12 != null)。

修复方案

方案1:直接用JdbcRowSet操作(更简洁)

跳过ResultSet的中间步骤,直接让JdbcRowSet连接数据库并执行查询,这样能完全掌控参数配置:

JdbcRowSet regis = new JdbcRowSetImpl(cn);
// 设置查询语句
regis.setCommand("SELECT admin.* FROM admin");
// 设置结果集类型和并发模式
regis.setType(ResultSet.TYPE_SCROLL_SENSITIVE);
regis.setConcurrency(ResultSet.CONCUR_UPDATABLE);
// 执行查询
regis.execute();

// 执行新增操作
regis.moveToInsertRow();
// 根据你的表字段设置值,比如id字段
regis.updateInt("id", 新的ID值);
// 其他字段依次用updateXXX方法设置,比如updateString("username", "newUser")
regis.insertRow();
// 回到当前行,避免后续操作异常
regis.moveToCurrentRow();

方案2:直接用ResultSet操作(如果坚持原流程)

如果一定要用ResultSet,确保步骤正确,并且表有主键:

Statement st1 = cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs12 = st1.executeQuery("SELECT admin.* FROM admin");

// 直接用ResultSet执行新增
rs12.moveToInsertRow();
rs12.updateInt("id", 新的ID值);
// 设置其他字段
rs12.insertRow();
rs12.moveToCurrentRow();

// 记得关闭资源
rs12.close();
st1.close();

额外注意事项

  • 不同JDBC驱动的细节要求可能有差异,比如MySQL驱动需要确保查询语句没有使用LIMIT(除非配合特定参数),同时要保证驱动版本和数据库版本兼容。
  • 操作完成后一定要记得关闭ResultSet、Statement、JdbcRowSet等资源,避免连接泄漏。

内容的提问来源于stack exchange,提问作者Noel Omondi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:14:17