在Java中重复使用ResultSet对象

3

我正在开发一个Swing项目,其中我使用JDBC-ODBC连接桥从SQL数据库中访问数据。我使用以下代码:

 try
  {
     Class.forName("sun.jdbc.odbc.JdbcodbcDriver");
     Connection con=DriverManager.getConnection("Jdbc:Odbc:dsn");
     Statement st=con.createStatement();
     ResultSet rs=st.executeQuery("select * from temp");
     int count c=0;
     while(rs.next())
     {
      c++;
     }

   }
  catch(Exception ex)        
   {
    ex.printStackTrace();
    }

在上述代码中,如果在 while 循环之后再次使用结果集对象,则会抛出异常,因为结果集已关闭。在断开模式下,是否有其他对象可以代替结果集从数据库获取数据?

为什么你想在 while 循环后使用结果集?在 while 循环中,你可以收集所有的数据。 - Renjith
从数据库中以离线模式获取数据,确实是一个挑战。 - Paul Bellora
1
@user1960524 嗯,这是不可能的,看看答案。 - fge
重复使用结果集可能没有太多意义(这取决于缓存的配置),因为它可能只会再次从数据库中读取数据,这是一个缓慢的操作。记住结果可能更合理。 - Audrius Meškauskas
@user1960524 当然可以。尝试将该代码放在另一个类中,并保留一个函数来执行结果集操作。然后在当前类的while循环中调用该函数。确保EDT不会冻结。试一试并告诉我结果。我已经实现了类似的功能。 - joey rohan
显示剩余4条评论
2个回答

9
结果集不包含结果,它是对仍然在数据库中(或者驱动程序缓存中)的结果进行迭代的一种方式。
所以这是完全正常的。
如果你想在断开连接后保留结果列表,只需在之前将它们复制到一个具体的列表中,例如ArrayList。这意味着您将不得不在此复制时对列进行解释(即使用 getInt、getString 或 getBinaryStream 并获取内容等)。

能否将结果集存储到另一个结果集以供进一步使用? - adesh singh
你的意思是不需要断开连接吗? - Denys Séguret
是的,我想在断开第一个之前将结果集存储在另一个中。 - adesh singh
如果您断开连接,将无法使用任何结果集。请将数据复制到ArrayList中或不要断开连接。 - Denys Séguret

4

在断开模式下,除了结果集之外还有其他对象可以从数据库中获取数据吗?

ResultSet 在建立连接后获取数据。并且没有其他对象执行此任务。

您应该将数据存储在某个列表(或其他数据结构)中,并在 while 循环中从 ResultSet 填充该列表。


能否将结果集存储在另一个结果集中以供进一步使用? - adesh singh
@user1960524 是的,可以使用CachedRowSet(或其他RowSet实现之一)来实现。 - Mark Rotteveel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接