行结果集getRow方法的总数

阅读以下代码:

public class selectTable { public static ResultSet rSet; public static int total=0; public static ResultSet onLoad_Opetations(Connection Conn, int rownum,String sql) { int rowNum=rownum; int totalrec=0; try { Conn=ConnectionODBC.getConnection(); Statement stmt = Conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String sqlStmt = sql; rSet = stmt.executeQuery(sqlStmt); total = rSet.getRow(); } catch(Exception e) { System.out.println(e.getMessage()); } System.out.println("Total Number of Records="+totalrec); return rSet; } } 

下面的代码不显示实际总数:

 total = rSet.getRow(); 

我的jTable显示4记录在jTable但总计= 0; 当我通过调试评估时,它显示:

 total=(int)0; 

而不是总数=(int)4如果我使用

 rSet=last(); above from the code total = rSet.getRow(); 

总计显示准确值= 4但rSet什么都不返回。 然后jTable是空的。 告诉我!

BalusC的答案是对的! 但我必须根据用户实例变量提及,例如:

 rSet.last(); total = rSet.getRow(); 

然后你失踪了

 rSet.beforeFirst(); 

剩下的代码是一样的,你会得到你想要的结果。

在返回ResultSet对象之前,需要调用ResultSet#beforeFirst()将光标放回第一行之前。 通过这种方式,用户将能够以通常的方式使用next()

 resultSet.last(); rows = resultSet.getRow(); resultSet.beforeFirst(); return resultSet; 

但是,到目前为止给出的代码存在更大的问题。 它正在泄漏数据库资源,它也不是一个合适的OOP方法。 查找DAO模式。 最终你想最终成为

 public List list() throws SQLException { // Declare Connection, Statement, ResultSet, List. try { // Use Connection, Statement, ResultSet. while (resultSet.next()) { // Add new Operation to list. } } finally { // Close ResultSet, Statement, Connection. } return list; } 

这样调用者只需使用List#size()来了解记录数。

正如其他人已经回答的那样,没有迭代直到结束就无法获得行数。 您可以这样做,但您可能不想这样做,请注意以下几点:

  1. 对于许多RDBMS系统,ResultSet是一个流API,这意味着它不会从数据库服务器加载(甚至可能获取)所有行。 在SO上看到这个问题。 通过迭代到ResultSet的末尾,您可能会显着增加在某些情况下执行所花费的时间。

  2. 默认的ResultSet对象不可更新,并且只有一个向前移动的游标。 我认为这意味着除非您使用ResultSet.TYPE_SCROLL_INSENSITIVE执行查询,否则rSet.beforeFirst()将抛出SQLException 。 这种方式的原因是因为可滚动游标存在成本。 根据文档,即使您创建可滚动游标,它也可能抛出SQLFeatureNotSupportedException

  3. 填充和返回List意味着您还需要额外的内存。 对于非常大的结果集,这根本不起作用。

所以最大的问题是哪个RDBMS? 总而言之,我建议不记录记录数量。

getRow()方法检索当前行号,而不是行数。 因此,在开始迭代ResultSetgetRow()返回0。

要获取执行查询后返回的实际行数,没有自由方法:您应该迭代它。

但是,如果您确实需要在处理行之前检索总行数,则可以:

  1. 则resultset.last()
  2. ResultSet.getRow()获取总行数
  3. ResultSet.beforeFirst()
  4. 正常处理ResultSet

一种更好的方法是使用SQL的SELECT COUNT语句。

当您需要返回的行数时,执行另一个查询,返回该查询的确切结果数。

  try { Conn=ConnectionODBC.getConnection(); Statement stmt = Conn.createStatement(); String sqlStmt = sql; String sqlrow = SELECT COUNT(*) from (sql) rowquery; String total = stmt.executeQuery(sqlrow); int rowcount = total.getInt(1); } 

查询后, getRow()方法将始终为0:

由resultset.getRow()

检索当前行号。

其次,输出totalrec但从不为其分配任何内容。

如果不迭代它,则无法获取ResultSet中返回的行数。 为什么在不迭代的情况下返回ResultSet呢? 首先执行查询没有意义。

更好的解决方案是将持久性与视图分开。 创建一个单独的数据访问对象,为您处理所有数据库查询。 让它获取要在JTable显示的值,将它们加载到数据结构中,然后将其返回到UI进行显示。 用户界面将拥有它所需的所有信息。

我已经解决了这个问题。 我唯一做的是:

 private int num_rows; 

然后在你的方法中使用结果集放置这段代码

 while (this.rs.next()) { this.num_rows++; } 

就这样

从resultset获取行数的最佳方法是使用count函数查询进行数据库访问,然后使用rs.getInt(1)方法获取行数。 从我的代码看它:

  String query = "SELECT COUNT() FROM table"; ResultSet rs = new DatabaseConnection().selectData(query); rs.getInt(1); 

这将返回从数据库中获取的行的int值。 这里DatabaseConnection()。selectData()是我访问数据库的代码。 我也被困在这里但后来解决了……