菜鸟路过.
不知道是不是跟这两个参数有关.
ResultSet.TYPE_SCROLL_SENSITIVE,                                 ResultSet.CONCUR_UPDATABLE总之楼主是以只读方式打开数据库的.

解决方案 »

  1.   

    听说这样慢,直接提交update语句呢?
      

  2.   

    根据api,通过ResultSet.CONCUR_UPDATABLE就是可修改的了,可是我的一直不行。
      

  3.   

    不要用select * ...作查询,
    而要用select <直接写出所有字段>的方式.
      

  4.   

    楼主 用的语句没有错误啊 我也研究了这个问题但是是不是首先要定位修改的行(使用absolute() relative() moveToInsertRow()等方法定位 ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE 这以后就应该可以了 还有楼主更新的变量数据类型是否相同
      

  5.   

    PreparedStatement pst = con.prepareStatement(sql,1005,1008);
    试试
      

  6.   

    我也是这个问题呀   用relative  movetoinsertrow这些next移动有什么区别 ?
    这些似乎 只是用于插入之类?
      

  7.   

    完整的代码打出来看看?包括完整的sql
      

  8.   

    建议数据库更新最好不要通过更新 resultSet 的方法来实现,最好是通过直接写更新语句,然后执行这个 sql 来实现。
      

  9.   

    呵呵,在CSDN有分,你的帖子就会上浮,如果给个20000000分,那就永远不沉没了
      

  10.   

    rs.updateString("printwaterno",String.valueOf(waterNum));//更新rs的printwaterno;
      

  11.   

    java.sql.SQLException: 对只读结果集的无效操作: updateString
    出现这个异常肯定是因为楼主的ResultSet是只读的,至于原因可能和楼主用的数据库和JDBC驱动程序的版本有关,因为有些JDBC驱动程序是不支持可读写结果集的
      

  12.   

    java.sql.SQLException: 对只读结果集的无效操作: updateString
    出现这个异常肯定是因为楼主的ResultSet是只读的,建议重新设置ResultSet st=Connection.getResultSet(.....)其中有参数,具体可以查询java类库!
      

  13.   

    数据库是oracle9.2,我也怀疑是否是驱动程序的问题,本来一直用oracle自带的classes12.jar,后来因为要操作Blob字段而换成ojdbc14.jar驱动,没想到现在又有这个问题,到底操作oracle用哪个版本的驱动才最好啊!
      

  14.   

    你的代码我测试过了,没有问题啊。
          DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.
                                       SQLServerDriver());
          String url ="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=test";
          String user = "sa";
          String password = "";      Connection conn=DriverManager.getConnection(url,user,password);      String sql="select col1 from test";
          PreparedStatement ps=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);      ResultSet rs=ps.executeQuery();
          rs.absolute(2);
          rs.updateString(1,"aaa");
          rs.updateRow();
      

  15.   

    同意Polarislee(北极星)(灌水是我无言的抗议) 的观点。
    估计是你的数据库驱动程序不支持滚动或者更新光标的请求。
      

  16.   

    to itjourney(IT之旅):
        你的数据库是sqlserver,而我的是oracle92,所以......。我的驱动是支持滚动的,有谁使用过oracle的updateString之类的方法成功的,麻烦发个驱动到,先谢过了!
      

  17.   

    ResultSet里很多都只是接口,
    还得看驱动实现了,
    而且这样做也慢,
    还是用update的好
      

  18.   

    楼主,我查阅java的帮助里写的是:1、prepareStatement 
     public abstract PreparedStatement prepareStatement(String sql) throws SQLException一条带有或不带 IN 参数的 SQL 语句可以被预编译并存放在 PreparedStatement 对象中。 该对象可用于有效地多次执行该语句。 
    注意: 为了处理那些能由预编译得到好处的带参数的 SQL 语句,该方法进行了专门的优化。如果驱动程序支持预编译,prepareStatement 将把该语句发送给数据库进行预编译。有些驱动程序不支持预编译。在这种情况下,在执行 PreparedStatement 语句之前,将不把语句发送到数据库。这对用户没有直接的影响;但是它确实影响某些 SQLExceptions 将由哪个方法抛出 。 参数: 
    sql - 一个 SQL 语句,它可以包含一个或多个 '?' IN 参数的位置标志符。 
    返回值: 
    一个包含该预编译语句的新建的 PreparedStatement 对象。 
    抛出: SQLException 
    如果发生了数据访问错误。
    2、execute 
     public abstract boolean execute(String sql) throws SQLException执行一条可能返回多个结果的 SQL 语句。 在某些(非正常)环境下,一个单独的 SQL 语句可能返回多个结果集和/或更新数量。通常,您可忽略该方法,除非您正执行事先知道可能会返回多个结果集的存储过程,或者您动态地执行一个未知的 SQL 字符串。 "execute"、"getMoreResults"、"getResultSet" 和"getUpdateCount" 方法可使得浏览多条结果。 "execute" 方法执行一条 SQL 语句并指示最初的结果形式。可使用 getResultSet 或 getUpdateCount 方法来检索结果,及 getMoreResults 方法来移动到任何后继的结果。 参数: 
    sql - 任何 SQL 语句 
    返回值: 
    如果下一个结果是 ResultSet ,返回 true;如果它是一个更新数量或没有其它结果,返回 false。 
    抛出: SQLException 
    如果发生了数据访问错误。 
     3、executeQuery 
     public abstract ResultSet executeQuery(String sql) throws SQLException执行一条返回单个 ResultSet 的 SQL 语句。 参数: 
    sql - 典型地,这是静态的 SQL SELECT 语句 
    返回值: 
    包含由查询产生的数据的 ResultSet;永远不为 null 。 
    抛出: SQLException 
    如果发生了数据访问错误。 4、executeUpdate 
     public abstract int executeUpdate(String sql) throws SQLException执行一条 SQL INSERT、UPDATE 或 DELETE 语句。 另外,可执行没有返回值的 SQL 语句,如 SQL DDL 语句。 参数: 
    sql - 一条 SQL INSERT、UPDATE 或 DELETE 语句或没有返回值的 SQL 语句 
    返回值: 
    如果执行 INSERT、UPDATE 或 DELETE 语句返回行数或者为执行没有返回值的语句返回 0 
    抛出: SQLException 
    如果发生了数据访问错误。
      

  19.   

    你用DatabaseMetaData中的supportResultSetType,supportsResultConcurrency,先检验你的数据库是否支持scrolling and updatable。然后
    String query = "SELECT * FROM Books";
    ResultSet rs = stat.executeQuery(query);
    while (rs.next())
    {
       if (. . .)
       {
          double increase = . . .
          double price = rs.getDouble("Price");
          rs.updateDouble("Price", price + increase);
          rs.updateRow();
       }
    }
      

  20.   

    上面还要设置
    Statement stat
       = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
          ResultSet.CONCUR_UPDATABLE);这些java core上都有详细地介绍。