日期:2014-05-20  浏览次数:20962 次

JDBC 在createStatement时设置游标是TYPE_FORWARD_ONLY,但是结果集中还是可以用previous()方法
JDBC 在createStatement时设置游标是TYPE_FORWARD_ONLY,但是结果集中还是可以用previous()方法,照api文档上说应该在调用previous()方法时会抛出exception的,感觉很奇怪
代码如下:
  Connection conn = null;
try {
conn = JDBCUtil.getConnection();
Statement stat = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stat.executeQuery("SELECT * FROM TABLE_NAME");
rs.next();
rs.next();
System.out.println(rs.getInt(1));
rs.previous();
System.out.println(rs.getInt(1));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
该table第一列是一个自增长的int值,这个程序执行的结果 为:
2
1
我用的数据库是MySql, driver是Connector/J(mysql-connector-java-5.1.17-bin.jar),我也换过其它的driver版本,也是有同样的问题,感觉很不解,请各位大侠帮忙看看,多谢!

------解决方案--------------------
这是因为到目前为止MySQL不支持TYPE_FORWARD_ONLY结果集的缘故,楼主可以在你代码里面JDBCUtil获取到连接之后添加下面的代码,利用DatabaseMetaData这个类查看数据库是否支持对应的结果集类型
Java code

        DatabaseMetaData dbmd=conn.getMetaData();
        if(dbmd.supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY)){
            System.out.println("*******MySQL支持TYPE_FORWARD_ONLY结果集**********");
        }else{
            System.out.println("*******MySQL不支持TYPE_FORWARD_ONLY结果集**********");
        }