Result set type is TYPE_FORWARD_ONLY解决方法
参考文章:
https://www.zhihu.com/tardis/sogou/art/32800331
http://blog.sina.com.cn/s/blog_bb3b5c230102v4wa.html
声明:
从这两篇文章,得出了问题的解决办法,第二篇文章很详细了,但是函数的使用让我没有看懂,第一篇文章直接从参数说起,一眼就看懂了,在看第二篇的解决办法,瞬间就悟了,所有结果集游标移动问题都止于此。
解决办法:
将conn.createStatement()、conn.prepareStatement(sql)中更改成下面即可
`
conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE)
conn.prepareStatement("select *from score",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE)
原理:
conn.createStatement()、conn.prepareStatement(sql):生成的结果集:不滚动、不敏感、不可更新!
createStatement(int resultSetType, int resultSetConcurrency)
prepareStatement(String sql, int resultSetType,int resultSetConcurrency)
resultSetType 参数:
ResultSet.FETCH_FORWORD: 指定处理记录集中行的顺序是由前到后,即从第一行开始处理一直到最后一行。
ResultSet.FETCH_REVERSE: 指定处理记录集中行的顺序是由后到前,即从最后一行开始处理一直到第一行。
ResultSet.FETCH_UNKNOWN: 不指定处理记录集中行的顺序,而由JDBC 驱动程序和数据库系统决定。
ResultSet.TYPE_FORWARD_ONLY: 指定数据库游标的移动方向是向前,不允许向后移动,即只能使用ResultSet 接口的next()方法而不能使用previous()方法,否则会产生错误。(默认)
ResultSet.TYPE_SCROLL_INSENSITIVE: 指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE: 指定数据库游标可以在记录集中前后移动并且当前数据库用户获取的记录集对其他用户的操作敏感。
resultSetConcurrency 参数:
**CONCUR_READ_ONLY:**该常数的作用是指定当前记录集的协作方式(concurrency
mode)为只读。一旦使用了这个常数,那么用户就不可以更新记录集中的数据。
**CONCUR_UPDATABLE:**该常数的作用是指定当前记录集的协作方式(concurrency
mode)为可以更新。一旦使用了这个常数,那么用户就可以使用updateXXX()等方法更新记录集中的数据。
不设置默认为不滚动
ResultSet的方法分为两类,一类用来判断游标位置的,另一类是用来移动游标的。如果结果集是不可滚动的,那么只能使用next()方法来移动游标,而beforeFirst()、afterLast()、first()、last()、previous()、relative()方法等都不能使用!!!
如果结果集可以滚动,下面函数可以使用
public boolean absolute(int row);
该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行。参数row 指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算。
public boolean relative(int rows);
该方法的作用也是将记录集中的某一行设定为当前行,但是它的参数rows 表示目标行相对于当前行的行号。
public boolean first();
该方法的作用是将当前行定位到数据库记录集的第一行。
public boolean last();
该方法的作用刚好和first()方法相反,是将当前行定位到数据库记录集的最后一行。
public boolean isFirst();
该方法的作用是检查当前行是否记录集的第一行。如果是,返回true ,否则返回false。
public boolean isLast();
该方法的作用是检查当前行是否记录集的最后一行。如果是,返回true, 否则返回false。
public void afterLast();
该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的后面。如果该记录集不包含任何的行该方法不产生作用。
public void beforeFirst();
该方法的作用是将数据库游标移到记录集的最前面,位于记录集第一行的前面。如果记录集不包含任何的行,该方法不产生作用。
public boolean isAfterLast();
该方法检查数据库游标是否处于记录集的最后面。如果是,返回true, 否则返回false。
public boolean isBeforeFirst( );
该方法检查数据库游标是否处于记录集的最前面。如果是,返回true, 否则返回false。
public boolean next( );
该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行。当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面。
public boolean previous( );
该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。
public boolean rowDeleted( );
如果当前记录集的某行被删除了,调用该方法返回true,否则返回false 。
public boolean rowInserted( );
如果当前记录集中插入了一个新行,该方法将返回true,否则返回false。
public boolean rowUpdated( );
如果当前记录集的当前行的数据被更新,该方法返回true, 否则返回false。
public void insertRow( );
该方法将执行插入一个新行到当前记录集的操作。
public void updateRow( );
该方法将执行更新当前记录集当前行的数据。
public void deleteRow( );
该方法将执行删除当前记录集的操作。
public void updateString(int columnIndex, String x);
该方法更新当前记录集的当前行某列的值,该列的数据类型是String, 该方法的参数columnIndex 指定所要更新的列的列索引,第一列的列索引是1 ,以此类推。
public void updateString(String columnName, String x);
该方法同上,其第一个参数是columnName 代表需要更新的列的列名而不是columnIndex。