使用SQL Server JDBC调用getMoreResults(KEEP_CURRENT_RESULT)报错不支持
解决SQL Server JDBC调用
getMoreResults(Statement.KEEP_CURRENT_RESULT)报错的问题 我之前在处理SQL Server多结果集的时候也踩过这个坑——SQL Server的JDBC驱动确实不支持Statement.KEEP_CURRENT_RESULT这个参数,这是驱动本身的设计限制,所以调用这个方法就会抛出你看到的This operation is not supported异常。
为什么会这样?
微软的JDBC驱动对多结果集的处理逻辑是:默认获取下一个结果集时会自动关闭当前的结果集,它没有实现保留当前结果集的功能,所以当你传入KEEP_CURRENT_RESULT参数时,驱动就会直接抛出不支持的错误。
可行的解决方案
既然不能直接保留当前结果集,我们可以换个思路:提前把当前结果集的数据缓存到内存中,再去获取下一个结果集。这样即使当前结果集被关闭,我们已经拿到了需要的数据。
举个手动处理的代码示例:
CallableStatement callableStatement = connection.prepareCall("{call YourStoredProcedure()}"); boolean hasResults = callableStatement.execute(); // 处理第一个结果集 if (hasResults) { ResultSet rs1 = callableStatement.getResultSet(); // 把结果集数据缓存到集合里 List<YourDataModel> firstDataset = new ArrayList<>(); while (rs1.next()) { YourDataModel model = new YourDataModel(); model.setId(rs1.getInt("id")); model.setName(rs1.getString("name")); // 其他字段映射 firstDataset.add(model); } // 手动关闭结果集(可选,驱动后续也会自动关闭) rs1.close(); // 获取下一个结果集,用默认的getMoreResults()(等价于CLOSE_CURRENT_RESULT) hasResults = callableStatement.getMoreResults(); if (hasResults) { ResultSet rs2 = callableStatement.getResultSet(); // 处理第二个结果集的逻辑 while (rs2.next()) { // 读取数据 } rs2.close(); } }
如果你用Spring JDBC框架的话,处理起来会更简洁,Spring会帮你管理结果集的生命周期,你只需要专注于数据提取:
jdbcTemplate.call(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { return con.prepareCall("{call YourStoredProcedure()}"); } }, new ResultSetExtractor<Object>() { @Override public Object extractData(ResultSet rs) throws SQLException, DataAccessException { // 处理第一个结果集 List<YourDataModel> firstDataset = new ArrayList<>(); while (rs.next()) { // 映射数据 } // 移动到下一个结果集 if (rs.getStatement().getMoreResults()) { ResultSet rs2 = rs.getStatement().getResultSet(); // 处理第二个结果集 } return firstDataset; } });
总结
不要尝试用KEEP_CURRENT_RESULT参数来保留SQL Server的结果集,驱动不支持这个操作。正确的做法是先把当前结果集的数据缓存到内存集合中,再去获取并处理下一个结果集。
内容的提问来源于stack exchange,提问作者Shajitha Begum K
相关产品推荐
相关产品推荐

