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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:16:39