在遍历结果集的时候,用rs.isLast()来判断是否到达最后一条,结果报出异常:
java.sql.SQLException: 对只转发结果集的无效操作: isLast
在网上找到一个解决方法是:
java 代码
- PreparedStatement ps = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
但是不明白原因,在网上搜到的资料如下:
结果集:即使用Statement实例执行一个SQL语句之后得到的一个ResulSet 的对象。其类型分为三种:基本结果集,可滚动结果集,可更新结果集。
一、基本结果集
1、特点:检索方法只有两种:ResultSet.next 和getXXX
2、Statement语句对象创建方式:
a.Statement语句:createStatement()
b.PreParedStatement语句:PreparedcreateStatement(String sql)
c.CallableStatement语句:CallablecreateStatement(String sql)
b.PreParedStatement语句:PreparedcreateStatement(String sql)
c.CallableStatement语句:CallablecreateStatement(String sql)
3、主要方法: a.boolean next()方法 将游标移到下一行,如果是有效数据则返回true,注意查询语句返回的结果中游标的位置为第一行的前面。
b.getXXX(int columnIndex)方法 按列号返回当前行中指定列的值,并将其转换为方法中XXX所对应的java数据类型。
c.getXXX(String columnName)方法 按名返回当前行中指定列的值,并将其转换为方法中XXX所对应的java数据类型。
二、可滚动结果集
1、特点:检索方法:提供各种定位游标的方法自由地再结果集中滚动。弥补了基本结果集只能先前滚动的局限性。
2 Statement语句对象创建方式:
a.Statement:createStatement(int resultSetType,int reslutSetConcurrency)
b.PrepareStatement:prepareStatement(String sql,int resultSetType,int reslutSetConcurrency)
c.CallableStatement:prepareCall(String sql,int resultSetType,int reslutSetConcurrency)
b.PrepareStatement:prepareStatement(String sql,int resultSetType,int reslutSetConcurrency)
c.CallableStatement:prepareCall(String sql,int resultSetType,int reslutSetConcurrency)
常量
|
含义描述
|
TYPE_FORWARD_ONLY
|
结果集不可滚动,相当于基本结果集。
|
TYPE_SCROLL_INSENSITIVE
|
结果集可滚动,但是当结果集处于打开状态时,对底层数据表中所作的变化不敏感。
|
TYPE_SCROL_SENSITIVE
|
结果集可滚动,并且当结果集处于打开状态时,对底层数据表中所作的变化敏感。
|
CONCUR_READ_ONLY
|
结果集不可更新,所以能够提供最大可能的并发级别。
|
CONCUR_UPDATABLE
|
结果介可更新,但只能提供受限的并发级别。
|
3、主要方法:
●boolean previous()
●boolean first()
●boolean last()
●void beforFirst()将游标移到第一行之前
●void afterLast()将游标移到最后一行之后
●boolean relative(int rows)相对于游标的当前位置将游标移动参数rows指定的行数,正数前负后。
●boolean absolute(int row)将游标移动到参数row指定的数据行 rows为正从结果集的开始向前,负从结果集的末尾向后,为零移到第一行之前。
●boolean first()
●boolean last()
●void beforFirst()将游标移到第一行之前
●void afterLast()将游标移到最后一行之后
●boolean relative(int rows)相对于游标的当前位置将游标移动参数rows指定的行数,正数前负后。
●boolean absolute(int row)将游标移动到参数row指定的数据行 rows为正从结果集的开始向前,负从结果集的末尾向后,为零移到第一行之前。
判断游标当前位置的方法“
● Boolean isBeforeFirst()如果游标位于第一行之前返回true.
●Boolean isAfterLast() 最后一行之后
●boolean isFirst()
●boolean isLast()
●Boolean isAfterLast() 最后一行之后
●boolean isFirst()
●boolean isLast()
三、可更新结果集
1、特点:可更新结果集的数据并将这些更新保存到数据库中。
2、创建方式:
a.Statement:createStatement(int resultSetType,int reslutSetConcurrency)
b.PrepareStatement:prepareStatement(String sql,int resultSetType,int reslutSetConcurrency)
c.CallableStatement:prepareCall(String sql,int resultSetType,int reslutSetConcurrency)
b.PrepareStatement:prepareStatement(String sql,int resultSetType,int reslutSetConcurrency)
c.CallableStatement:prepareCall(String sql,int resultSetType,int reslutSetConcurrency)
reslutSetConcurrency为CONCUR_UPDATABLE
3、主要方法
更新有两种方式,
第一种方式是更新当前数据行的数据,如:
rs.absolute(5); // 移动rs指针至第5行数据
rs.updateString("NAME", "daniel"); // 将该行name列的值更新为“daniel”
rs.updateRow(); //更新数据源的数据
rs.absolute(5); // 移动rs指针至第5行数据
rs.updateString("NAME", "daniel"); // 将该行name列的值更新为“daniel”
rs.updateRow(); //更新数据源的数据
第二种方式是插入一行数据,如:
rs.moveToCurrentRow();
相关推荐
在数据库操作中,有时会遇到一些异常情况,比如尝试对一个不支持滚动(scroll)或某些特定操作的结果集进行操作时,系统可能会抛出异常。本篇文章将针对此类问题提供详细的解决方案,并通过分析具体的异常堆栈信息来...
为了实现对First集与Follow集的计算,我们可以参考提供的部分代码片段。下面详细介绍算法的实现过程: ##### 3.1 数据结构设计 - `multimap, string> sentence;`:用于存储上下文无关文法的产生式。 - `multimap, ...
根据给定的信息,本文将详细解释如何通过编程方式计算上下文无关文法(Context-Free Grammar, CFG)中的First集和Follow集。First集是对于一个符号(非终结符),能够直接推导出的第一个符号(包括终结符和空串^)的...
- `rs.isLast()`:判断当前游标是否在结果集的最后一行。 - `rs.isBeforeFirst()`:判断当前游标是否在结果集的第一行之前。 - `rs.isAfterLast()`:判断当前游标是否在结果集的最后一行之后。 3. **可滚动性...
1. ResultSet.TYPE_FORWARD_ONLY:指针只允许向前移动,不会受到其他用户对该数据库所作更改的影响。 2. ResultSet.TYPE_SCROLL_INSENSITIVE:指针可以前后移动,甚至可以进行特定定位,不会受到其他用户对该数据库...
`moveToInsertRow()`用于开始插入操作,`insertRow()`将插入行添加到结果集并保存到数据库,而`deleteRow()`则用于删除当前行。 3. **事务隔离级别**: `Connection`对象提供了`setTransactionIsolation(int level...
1. **新的记录集接口(ResultSet 接口)**:ResultSet接口是JDBC中用于存储查询结果的对象,JDBC 2.0对其进行了扩展,添加了更多的常量和方法来增强其功能。 - **常量定义**: - `FETCH_FORWARD`:指定默认的行处理...
- `rs.isLast()`:判断光标是否位于结果集的最后一行。 - `rs.isBeforeFirst()`:判断光标是否位于结果集的第一行之前。 - `rs.isAfterLast()`:判断光标是否位于结果集的最后一行之后。 ##### 3. 更新数据相关方法...
除了这四种操作外,还有一项重要的任务是处理查询结果集(Recordset),即如何遍历查询结果并从中提取所需的信息。 ##### 3.2 SQLite数据库API 在Android中,核心的SQLite数据库API包括`SQLiteDatabase`类及其相关...
在IT领域,特别是数据库管理和应用开发中,对数据集(dataset)进行操作是十分常见的需求之一。其中,为数据记录自动生成序号是一项基础而重要的功能。本文将根据提供的文件信息,详细介绍如何在数据集中实现自动...
`requery()`用于重新执行查询,`isAfterLast()`、`isBeforeFirst()`、`isFirst()`和`isLast()`则用于判断指针的位置,`moveToFirst()`、`moveToLast()`和`moveToNext()`则帮助在结果集中移动。 最后,`...
在Android开发中,数据库操作是一个重要的组成部分,特别是对于存储和检索应用程序数据的需求。SQLite是Android系统默认支持的关系型数据库,它轻量级且高效,非常适合移动设备。本文将详细介绍如何在Android中进行...
下面是对 SQLite 的详细介绍: 数据库连接 Android 中使用 SQLite 数据库,所有相关的接口和类都在 android.database 和 android.database.sqlite 两个包下。其中,SQLiteOpenHelper 是一个抽象类,提供了创建和...
**isFirst/isLast:** 分别用于判断数据行是否为第一行或最后一行。 **isEven/isOdd:** 判断数据行是否为偶数行或奇数行。这些条件经常用于样式化或格式化目的。 **isMarked:** 判断数据行是否被标记。此功能可...
14. 获取游标位置:在处理结果集`ResultSet`时,`getRow()`返回当前行数,`isFirst()`、`isBeforeFirst()`、`isLast()`和`isAfterLast()`用于判断当前位置。 15. 禁止表单后退显示过期:设置响应头禁止缓存,如在...