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
相关产品推荐
相关产品推荐

