获取ResultSet列名时报错[游标类型/并发组合不支持]求助
解决ResultSet获取列名时的"The cursor type/concurrency combination is not supported"错误
嘿,我帮你排查下这个问题——这个错误提示有点迷惑人,但其实根源很明确,咱们一步步来:
1. 核心问题:JDBC列索引是从1开始计数的
你代码里的循环变量j从0开始,但JDBC的ResultSetMetaData所有方法(比如getColumnName()、getCatalogName())的列索引参数都是从1起步的。当你传入j=0时,相当于访问了不存在的列索引,这会触发底层的游标异常(错误提示虽然提到了游标组合不支持,但本质是索引越界导致的)。
2. 修复后的代码
我帮你调整了循环逻辑,同时优化了ResultSetMetaData的调用(没必要每次循环都重新获取,提前拿一次就行):
String sql = "Select * From Coa32"; PreparedStatement stmt = dbConnectionSQLServer.getCN().prepareStatement(sql); ResultSet rs = stmt.executeQuery(); ResultSetMetaData metaData = rs.getMetaData(); // 生成表头 int columnCount = metaData.getColumnCount(); for (int j = 1; j <= columnCount; j++) { // 从1开始,到总列数结束 // System.out.println("Colum Count : " + columnCount + ", Column Name (1) : " + metaData.getCatalogName(j)); tableHeaderNames.add(new ColumnModel("header "+(j-1), " col:"+ metaData.getColumnName(j))); } // 记得用完关闭资源,别漏了 rs.close(); stmt.close();
3. 额外的小建议(避免后续踩坑)
- 自动管理资源:推荐用try-with-resources语法,它会自动帮你关闭
ResultSet和PreparedStatement,不用手动写close,防止资源泄漏:try (PreparedStatement stmt = dbConnectionSQLServer.getCN().prepareStatement(sql); ResultSet rs = stmt.executeQuery()) { ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); for (int j = 1; j <= columnCount; j++) { tableHeaderNames.add(new ColumnModel("header "+(j-1), " col:"+ metaData.getColumnName(j))); } } catch (SQLException e) { e.printStackTrace(); // 这里可以加你自己的异常处理逻辑,比如日志记录 } - 游标类型的特殊场景:如果之后你需要对ResultSet做滚动操作(比如前后移动游标),可以在创建PreparedStatement时指定游标类型和并发模式,比如:
不过你的场景只是获取列名,默认的游标类型完全够用,核心还是刚才说的索引问题。PreparedStatement stmt = dbConnectionSQLServer.getCN().prepareStatement( sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY );
内容的提问来源于stack exchange,提问作者Nasir Abbas
相关产品推荐
相关产品推荐

