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 它实际上是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章