今天看到这样的一个文章,感觉写的挺好,就把它拿过来收藏一下,也与大家分享一下。有位朋友在使用ResultSet.last时,遇到了这样的问题java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Unsupported method: ResultSet.last。
在不想再次通过查询数据库得到记录条数的情况下,(如:select count(*) from tableName)我们可能会使用ResultSet.last()方法将游标指向结果集末尾,并使用ResultSet.getRow()方法获取当前行号来取得最大行号。
可能遇到这样的问题:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Unsupported method: ResultSet.last
说JDBC不支持这种方法,这是因为Statement对象是专门处理ResultSet记录的API对象,所以它对于所要处理的ResultSet还是有要求的,如果要使用扩展式的游标,那么就要使用以下构造:
Statement = Connection.createStatement(int resultSetType,int resultSetConcurrency)
resultSetType(结果集类型)包括:
ResultSet.TYPE_FORWARD_ONLY 缺省类型。该常量指示光标只能向前移动的 ResultSet 对象的类型。
ResultSet.TYPE_SCROLL_INSENSITIVE 该常量指示可滚动但通常不受 ResultSet 底层数据更改影响的 ResultSet 对象的类型。
ResultSet.TYPE_SCROLL_SENSITIVE 该常量指示可滚动并且通常受 ResultSet 底层数据更改影响的ResultSet 对象的类型。
resultSetConcurrency(并发类型)包括:
ResultSet.CONCUR_READ_ONLY 缺省类型。该常量指示不可以更新的 ResultSet 对象的并发模式。
ResultSet.CONCUR_UPDATABLE 该常量指示可以更新的 ResultSet 对象的并发模式。
了解了以上的构造之后,我们便对Statement进行修改如下:
Connection conn = DBConn.getConnection();
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String sql = "select * from table1"; // 查询表table1中的内容
ResultSet rs = stmt.executeQuery(sql); // 执行sql语句
rs.last(); // 定位光标到最后一条记录
System.out.println(rs.getRow()); // 打印当前,即最后一条记录的行号
分享到:
相关推荐
* rs.last():将光标定位到结果集中最后一行 * rs.beforeFirst():将光标定位到结果集中第一行之前 * rs.afterLast():将光标定位到结果集中最后一行之后 3. 更新操作: * rs.insertRow():把插入行加入数据库和...
ResultSet 通过一套 get 方法访问当前行中的不同列,例如 getInt、getString、getFloat 等。 在使用 ResultSet 之前,需要先执行 SQL 语句,并将结果存储到 ResultSet 对象中。例如: ```java java.sql.Statement ...
- `rs.last()`:将光标定位到结果集的最后一行。 - `rs.beforeFirst()`:将光标定位到结果集的第一行之前。 - `rs.afterLast()`:将光标定位到结果集的最后一行之后。 ##### 2. 测试光标位置的方法 - `rs.isFirst()...
例如,`resultSet.getInt(1)`或`resultSet.getString("columnName")`。 4. 遍历结果集:为了完整遍历ResultSet,你需要在while循环中使用next()方法,直到它返回false为止。示例代码如下: ``` while (resultSet....
检查JSP中的SQL查询和对ResultSet的操作是否符合上述规范,是解决问题的关键。 为了修复这个问题,首先要确保正确处理ResultSet。在遍历完所有数据后,务必调用`resultSet.close()`来释放资源。同时,确保在查询前...
supplierData.put(Integer.valueOf(resultSet.getInt("sup_id")), resultSet.getString("sup_name")); } catch (Exception e) { e.printStackTrace(); } return supplierData;//返回映射关系 } public ...
ResultSet是Java数据库连接(JDBC)...在创建Statement或PreparedStatement对象时,通过设置适当的参数(如`ResultSet.TYPE_SCROLL_INSENSITIVE`,`ResultSet.CONCUR_UPDATABLE`等)来创建可滚动和可更新的ResultSet。
一次只从数据库中查询最大maxCount条记录 ... PreparedStatement pstat = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); //最大查询到第几条记录.........
user.setName(resultSet.getString("name")); user.setAge(resultSet.getInt("age")); userList.add(user); } ``` 4. 将List转换为JSON字符串: 使用Jackson的ObjectMapper进行转换: ```java ObjectMapper...
- `ResultSetMetaData`:通过`ResultSet.getMetaData()`获取,提供了关于查询结果列的信息,如列名、数据类型等。 - `ResultSet.getString(int columnIndex)`:用于获取指定列的字符串值。 - `ResultSet.getInt(int ...
例如,可以使用`ResultSet.isBeforeFirst()`、`ResultSet.isAfterLast()`、`ResultSet.isFirst()`、`ResultSet.isLast()`等方法来判断当前状态。 3. **异常处理**:添加适当的异常处理逻辑,确保程序在遇到这类问题...
resultSet.getString (5), resultSet.getString (6), resultSet.getString (7), resultSet.getString (8) ); preparedStatement.close (); ConnDB.terminate(); return users; } else { preparedStatement....
例如,使用`ResultSet.first()`可以移到第一行,`ResultSet.last()`移到最后一行,`ResultSet.absolute(int row)`则可以直接移动到指定的行号。此外,`ResultSet.previous()`允许向后移动一行,而`ResultSet....
rs.last(); int rowCount = rs.getRow(); ``` 这样,我们就可以获取结果集的总行数。 三、Stream 流中的 count() 方法 在 Java 8 中,引入了 Stream 流的概念,可以用来处理大量数据。Stream 流中的 count() 方法...
- 在对ResultSet进行任何更新操作之前,最好先调用`rsConcurrency = ResultSet.CONCUR_UPDATABLE`设置并发模式,以启用更新功能。 - 不是所有的数据库驱动都支持插入行功能,因此在设计应用程序时需要考虑兼容性问题...
Java的PreparedStatement接口允许我们设置游标类型和获取结果集的方式,例如设置为ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_READ_ONLY,这可以防止数据被一次性加载到内存。同时,通过调用setFetchSize方法...
### ResultSet对象获取数据的各种方法 在Java编程语言中,`ResultSet`对象是处理数据库查询结果的核心组件之一。它充当一个可滚动的、可更新的数据表,用于存储从数据库执行SQL语句后返回的结果集。本文将详细介绍...
- `resultSetType`:设置`ResultSet`的滚动模式,`ResultSet.TYPE_FORWARD_ONLY`表示仅支持前向滚动,`ResultSet.TYPE_SCROLL_INSENSITIVE`和`ResultSet.TYPE_SCROLL_SENSITIVE`则允许双向滚动,区别在于后者对数据...