ResultSet.TYPE_FORWARD_ONLY它是如何工作的?

时间:2013-09-22 08:42:14

标签: java mysql jdbc resultset

我有以下代码:

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 个答案:

答案 0 :(得分:1)

TYPE_FORWARD_ONLY 表示只能向前导航ResultSet。您无法在ResultSet中向后移动

在这种情况下,我认为允许调用previous()因为缓存,尝试更改提取大小:

st.setFetchSize(Integer.MIN_VALUE);

或者从结尾读取结果集而不事先从头到尾阅读(下一步)......

要向后移动,请尝试:

rs.afterLast()
while (rs. previous())
{
    System.out.println(rs.getString("iD"));

}

如果在两种情况下驱动程序都在不抛出SQLException的情况下继续执行,那么它可能是您正在使用的驱动程序的错误...