代码如下:
cs = conn.prepareCall("{?=call fn_get_unit_workinfo_list(?,?,?)}", ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
cs.registerOutParameter(1, -10);
cs.setString(2, "8828");
cs.setString(3, sdf.format(getBeforeDay()));
cs.setString(4, sdf.format(new Date()));
cs.execute();
rs = (ResultSet) cs.getObject(1);
if (rs.first()) {
    System.out.println(rs.getString(11));   
}
报错如下:
java.sql.SQLException: 对只转发结果集的无效操作: first
at oracle.jdbc.driver.BaseResultSet.first(BaseResultSet.java:87)
at cn.yz.test.Test_SLX.savePermission_glstj(Test_SLX.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)网上我找过资料,如果要用到ResultSet 的first();last()等方法需要改变游标的课控制性,即
cs = conn.prepareCall("{?=call fn_get_unit_workinfo_list(?,?,?)}", ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);但是我加了之后还是没有效果,请各位大神帮忙看下是什么问题,弄了一下午了,都是一样的解决方法,但是不起作用,求帮忙!

解决方案 »

  1.   

    一般都用rs.next()来判断是否有记录。
      

  2.   

    rs.first()是将指针移到ResultSet的第一行
      

  3.   

    resultset的定义是只读向前的游标
    数据结构决定了,只能一个一个的next,无法定位。
      

  4.   

    很简单,你那两个参数是控制什么的?是控制Statement本身返回的对象的如果你是
    cs = conn.createStatemnt(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);ResultSet rs = cs.executeQuery();那么这个结果集是可以回滚到first的你是cs.execute(); 这里已经把这两个参数耗用了。   cs.getObject()强转成rs,这个结果集为什么要受你那两个参数控制?
      

  5.   

    如果你是SQLServer等数据库,返回的结果集是不占用参数位置的,直接用cst.getResultSet获得结果集也可以利用上面的参数,Oracle返回的不行。