把你程序中创建Statement对象时的语句改为下面的,试试看:Statement stmt = con.createStatement(                                     ResultSet.TYPE_SCROLL_INSENSITIVE,                                      ResultSet.CONCUR_READ_ONLY);

解决方案 »

  1.   

    建议看一下java.sql.Statement的源代码的注释说明
      

  2.   

    你的statement创建的有问题,因该这么得到statement对象
    Statement stmt = con.createStatement(                                     ResultSet.TYPE_SCROLL_INSENSITIVE,                                      ResultSet.CONCUR_READ_ONLY);
    这样就可以
      

  3.   

    为什么要这样创建Statement对象????
      

  4.   

    Statement是SQL语句的执
    些常数用于指定ResultSet 的类型游标移动的方向等性质如下所示
    public static final int FETCH_FORWARD;
    public static final int FETCH_REVERSE;
    public static final int FETCH_UNKNOWN;
    public static final int TYPE_FORWARD_ONLY;
    public static final int TYPE_SCROLL_INSENSITIVE;
    public static final int TYPE_SCROLL_SENSITIVE;
    public static final int CONCUR_READ_ONLY;
    public static final int CONCUR_UPDATABLE;
    FETCH_FORWORD 该常数的作用是指定处理记录集中行的顺序是由前到后即从
    第一行开始处理一直到最后一行
    FETCH_REVERSE 该常数的作用是指定处理记录集中行的顺序是由后到前即从最
    后一行开始处理一直到第一行
    FETCH_UNKNOWN 该常数的作用是不指定处理记录集中行的顺序由JDBC 驱动
    
    第9 章JDBC 2.0/3.0 API 的新特性
    程序和数据库系统决定
    TYPE_FORWARD_ONLY 该常数的作用是指定数据库游标的移动方向是向前不允
    许向后移动即只能使用ResultSet 接口的next()方法而不能使用previous()方法否则会
    产生错误
    TYPE_SCROLL_INSENSITIVE 该常数的作用是指定数据库游标可以在记录集中前后
    移动并且当前数据库用户获取的记录集对其他用户的操作不敏感就是说当前用户正
    在浏览记录集中的数据与此同时其他用户更新了数据库中的数据但是当前用户所获
    取的记录集中的数据不会受到任何影响
    TYPE_SCROLL_SENSITIVE 该常数的作用是指定数据库游标可以在记录集中前后移
    动并且当前数据库用户获取的记录集对其他用户的操作敏感就是说当前用户正在浏
    览记录集但是其它用户的操作使数据库中的数据发生了变化当前用户所获取的记录集
    中的数据也会同步发生变化这样有可能会导致非常严重的错误产生建议慎重使用该常

    CONCUR_READ_ONLY 该常数的作用是指定当前记录集的协作方式(concurrency
    mode)为只读一旦使用了这个常数那么用户就不可以更新记录集中的数据
    CONCUR_UPDATABLE 该常数的作用是指定当前记录集的协作方式(concurrency
    mode)为可以更新一旦使用了这个常数那么用户就可以使用updateXXX()等方法更新记
    录集中的数据
    在JSP/Servlet 程序中如何使用这些预定义的常数呢?这是读者很关心的问题在9.2.2
    节中将有介绍
    2 ResultSet 接口提供了一整套的定位方法
    这些可以在记录集中定位到任意一行具体有
    public boolean absolute(int row); 该方法的作用是将记录集中的某一行设定为当前
    行亦即将数据库游标移动到指定的行参数row 指定了目标行的行号这是绝对的行号
    由记录集的第一行开始计算不是相对的行号
    public boolean relative(int rows); 该方法的作用也是将记录集中的某一行设定为当
    前行但是它的参数rows 表示目标行相对于当前行的行号例如当前行是第3 行现在需
    要移动到第5 行去既可以使用absolute()方法也可以使用relative()方法代码如下

    rs.absolute(5);
    或者
    rs.relative(2);
    其中rs 代表ResultSet 接口的实例对象
    又如当前行是第5 行需要移动到第3 行去代码如下

    rs.absolute(3);
    或者
    rs.relative(-2);
    其中rs 代表ResultSet 接口的实例对象行接口,
      

  5.   

    
    读者需要注意的问题是传递给relative()方法的参数如果是正数那么数据库游标
    向前移动如果是负数那么数据库游标向后移动
    注意在本章中所说的数据库游标向前移动是指向行号增大的方向移动向后移动是
    指向行号减少的方向移动
    public boolean first(); 该方法的作用是将当前行定位到数据库记录集的第一行
    public boolean last(); 该方法的作用刚好和first()方法相反是将当前行定位到数据
    库记录集的最后一行
    public boolean isFirst(); 该方法的作用是检查当前行是否记录集的第一行如果是
    返回true 否则返回false
    public boolean isLast(); 该方法的作用是检查当前行是否记录集的最后一行如果
    是返回true 否则返回false
    public void afterLast(); 该方法的作用是将数据库游标移到记录集的最后位于记录
    集最后一行的后面如果该记录集不包含任何的行该方法不产生作用
    public void beforeFirst(); 该方法的作用是将数据库游标移到记录集的最前面位于
    记录集第一行的前面如果记录集不包含任何的行该方法不产生作用
    public boolean isAfterLast(); 该方法检查数据库游标是否处于记录集的最后面如果
    是返回true 否则返回false
    public boolean isBeforeFirst(); 该方法检查数据库游标是否处于记录集的最前面如
    果是返回true 否则返回false
    public boolean next(); 该方法的作用是将数据库游标向前移动一位使得下一行成为
    当前行当刚刚打开记录集对象时数据库游标的位置在记录集的最前面第一次使用next()
    方法将会使数据库游标定位到记录集的第一行第二次使用next()方法将会使数据库游
    标定位到记录集的第二行以此类推
    注意如果在当前行打开了一个输入流(Input Stream) 那么再次使用next()方法时
    将会自动关闭该输入流
    public boolean previous(); 该方法的作用是将数据库游标向后移动一位使得上一行
    成为当前行