ResultSet.TYPE_FORWARD_ONLY 它实际上是如何工作的?
Posted
技术标签:
【中文标题】ResultSet.TYPE_FORWARD_ONLY 它实际上是如何工作的?【英文标题】:ResultSet.TYPE_FORWARD_ONLY how does it actually work? 【发布时间】:2013-09-27 07:51:27 【问题描述】:我有以下代码:
try(Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","VENIVIDIVICI");
Statement st = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.executeQuery("SELECT * FROM example184"))
rs.absolute(2);
rs.absolute(1);
rs.beforeFirst();
while (rs.next())
System.out.println(rs.getString("iD"));
while(rs.previous())
System.out.println(rs.getString("Id"));
catch(SQLException sql )System.out.println(sql);
它应该给出一个 SQLException,因为它只是 ResultSet.TYPE_FORWARD_ONLY
,而不是它可以正常工作而不会引发任何异常。
更新:正如 Aleroot 在以下回复中建议的那样,我尝试了以下修改:
try(Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","VENIVIDIVICI");
Statement st = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.executeQuery("SELECT * FROM example184"))
st.setFetchSize(Integer.MIN_VALUE);
rs.afterLast();
while (rs.previous())
System.out.println(rs.getString("iD"));
catch(SQLException sql )System.out.println(sql);
没有成功,它仍然可以正常编译和运行。
谢谢, 确实如此
【问题讨论】:
【参考方案1】:TYPE_FORWARD_ONLY 表示 ResultSet 只能向前导航。您不能在 ResultSet 中向后移动。
在这种情况下,我认为允许调用previous()
,因为它已被缓存,请尝试更改获取大小:
st.setFetchSize(Integer.MIN_VALUE);
或者从头到尾读取结果集,而不是之前从头到尾读取(with next) ...
向后移动尝试:
rs.afterLast()
while (rs. previous())
System.out.println(rs.getString("iD"));
如果在这两种情况下驱动程序继续执行而不抛出 SQLException,则可能是您正在使用的驱动程序的错误...
【讨论】:
@我已经尝试了这两种方法,它仍然有效,我正在用代码更新问题 你使用的是什么版本的 JDBC 驱动? JDBC 4.1 mysql驱动5.1 试试:mysql-connector-java-5.1.25-bin 所以最终的答案是依赖于驱动程序?以上是关于ResultSet.TYPE_FORWARD_ONLY 它实际上是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章