如题,我想把结果集复制到另外一个类似也为ResultSet的东东里去,但有同志说这是个接口,无法复制的!是这样的吗?没其它办法把结果集内的同样东西放到另外一个ResultSet里吗?
如果可以放进去,我是想先关闭数据库连接,然后使用getString()类似的方法对这个新的ResultSet进行操作!可以吗?

解决方案 »

  1.   

    回lianhg(lianhg):说来有意思,也许是我本身思路就不对!是这样的:
    我写了一个数据库的“基本操作类”,只包括建立连接,执行语句的方法!另外一个类(叫做B)里有几个方法,具体都是采用先前这个“基本操作类”,然后试图得到一个结果集!每个方法都是返回的结果集!
    然后我在真正要操作结果集的一个java中,进行真正对数据的读取操作,但问题是得关闭连接!
    所以我没办法,想在B里复制一个结果集,然后在B里把这些连接都关闭了!不知道我说清楚没??
      

  2.   

    ResultSet的实现是厂商做的事,如果重写了clone方法,那么是可以深拷贝的但似乎并没有这么做
    所以,你还是需要先处理rs,否则,conn关闭后,rs就失效了
      

  3.   

    请用javabean对数据先进行封装
      

  4.   

    有人提供了这样的方法,不知道可行吗?用CachedRowSet,例:
    rs = stmt.executeQuery("select col1, col2 from test_table");
                
    // create a new rowset and populate it...
    CachedRowSet crs = new CachedRowSet();
    crs.populate(rs);  
    CachedRowSet crs2 = (CachedRowSet)crs.clone();
    clone()我查了一下,是对cookie的操作!这个CachedRowSet是哪里定义的?
      

  5.   

    我查了一下,JDK中有提到这个CachedRowSet,似乎可行??
      

  6.   

    的确是这样的,结果集中要调用rs.next();来滚动的话必定需要数据库链接!
      

  7.   

    深蓝忧郁,你提供的方法没错,肯定可以做到的,主要是我不想有大的改动,想找个简便的办法!如果数据量很大,我不可能全部搂出来放到一个hashmap里吧??就算可以的话,问题是,我要循环很多次,对每个字段都要取出来放进去,好象不方便啊!我查了一下CachedRowSet提供的方法populate()
    populate
    void populate(ResultSet data)
                  throws SQLException
    Populates this CachedRowSet object with data from the given ResultSet object. 
    This method can be used as an alternative to the execute method when an application has a connection to an open ResultSet object. Using the method populate can be more efficient than using the version of the execute method that takes no parameters because it does not open a new connection and re-execute this CachedRowSet object's command. Using the populate method is more a matter of convenience when compared to using the version of execute that takes a ResultSet object. 
    Parameters:
    data - the ResultSet object containing the data to be read into this CachedRowSet object 
    大家看看,我可以采用这个吗?
      

  8.   

    用Array+Hashmap来implement一个ResultSet吧,先只提供最简单的几个方法,例如数据定位,内容获取。
    其它方法统统throwException。
    然后写一个方法从一个ResultSet中把资料灌到你写的ResultSet对象中。
    然后...就可以关掉数据库连接了。
      

  9.   

    楼主的思路是对的,基本就是DAO层的做法。
    给个简单例子:
       
               public Collection getAllAreas() {
    String sql = "SELECT * FROM area_code ORDER BY code";
    Connection conn = DBConnectFactory.getInstance().getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;
    Collection areaTypes = new ArrayList();
    try {
    ps = conn.prepareStatement(sql);
    rs = ps.executeQuery();
    while (rs.next()) {
    Types type = new Types();
    type.setId(rs.getInt("code"));
    type.setName(rs.getString("name"));
    areaTypes.add(type);
    }
    return areaTypes;
    }
    catch (Exception e) {
    System.out.println("数据库操作失败!");
    e.printStackTrace();
    }
    finally {
    try {
    ps.close();
    DBConnectFactory.CloseConnection(conn);
    }
    catch (Exception e1) {
    e1.printStackTrace();
    }
    }
    return null;
    }
      

  10.   

    楼主可以把结果存在List中,然后序列化以后就可以随意存了。
      

  11.   

    可以使用 javax.servlet.jsp.jstl.sql.Result