关于JDBC不支持ResultSet.last()等方法的解决

本文介绍了解决使用微软JDBC for SQL Server sp3时遇到的问题,即不支持ResultSet.last()等方法的情况。通过设置Statement变量的方式可以解决此问题,具体设置包括使用ResultSet.TYPE_SCROLL_SENSITIVE等参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象:使用微软的JDBC for SqlServer sp3却发现不支持ResultSet.last(),ResultSet.beforeFirst() 等方法,每次一调用这些方法就出现异常,异常信息是:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Unsupported method: ResultSet.last

解决:Statement变量要按照如下设置

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

类似的,

CallableStatement cs = conn.prepareCall("{call TESTSP}",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

其中type_scroll_sensitive是个关键

字段摘要

TYPE_SCROLL_SENSITIVE

 该常量指示可滚动但通常受其他的更改影响的 ResultSet 对象的类型。

 
### 关于JDBC ResultSet方法 #### 基础概念 `ResultSet` 是 Java 数据库连接(JDBC)API 的一部分,代表由 `executeQuery()` 方法执行 SQL 查询后返回的结果表。此结果集不仅包含查询所得到的数据行,还提供了一系列方法来操作这些数据[^2]。 #### 获取不同类型的数据 为了读取来自数据库的不同类型的字段值,`ResultSet` 提供了多种获取器(`getXXX`)方法,每种对应特定的数据类型。例如: - `getInt(String columnLabel)` 或者 `getInt(int columnIndex)` - `getString(String columnLabel)` 或者 `getString(int columnIndex)` - 类似地还有其他如 `getDate`, `getTime`, `getTimestamp`, `getDouble`, `getBoolean` 等等。 ```java // 示例:从名为 'id' 和 'name' 的两列中提取整数型ID以及字符串姓名 int id = resultSet.getInt("id"); String name = resultSet.getString(2); // 使用索引也可以指定要检索哪一列 ``` #### 遍历结果集 使用 `next()` 方法可使游标前进至下一行;当首次调用时会定位到第一行之前的位置。如果已经到达最后一行之后,则该函数将返回 false 表明没有更多可用记录[^5]。 ```java while (resultSet.next()) { int userId = resultSet.getInt("user_id"); String userName = resultSet.getString("username"); } ``` #### 更新与删除功能 除了只读模式外,某些情况下还可以利用 `updateRow()`, `deleteRow()` 来修改现有记录或移除它们。不过需要注意的是,在默认设置下,大多数驱动程序仅支持向前滚动的只读光标。对于更复杂的导航需求,可能需要配置不同的属性以启用更新能力[^1]。 #### 处理元数据 通过关联的对象 `ResultSetMetaData` 可获得有关当前结果集中各列的信息,比如名称、大小和类型等特性。这对于动态解析未知结构的数据特别有用[^4]。 ```java ResultSetMetaData metaData = resultSet.getMetaData(); int numberOfColumns = metaData.getColumnCount(); for (int i = 1; i <= numberOfColumns; ++i) { System.out.println(metaData.getColumnName(i)); } ``` #### 完整示例代码片段展示如何结合上述知识点工作 下面给出了一段完整的例子,展示了怎样建立连接并处理一个简单的 SELECT 查询返回的结果集: ```java Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { Class.forName("com.mysql.cj.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, username, password); String sql = "SELECT * FROM users WHERE age > ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, minAge); rs = pstmt.executeQuery(); while(rs.next()){ long id = rs.getLong("id"); String firstName = rs.getString("first_name"); String lastName = rs.getString("last_name"); System.out.printf("%d %s %s\n", id, firstName, lastName); } } catch(Exception e){ throw new RuntimeException(e.getMessage()); } finally{ try{if(conn!=null&&!conn.isClosed()) conn.close();}catch(SQLException ignore){} try{if(pstmt!=null&&!pstmt.isClosed()) pstmt.close();}catch(SQLException ignore){} try{if(rs!=null&&!rs.isClosed()) rs.close();}catch(SQLException ignore){} } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值