行结果集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()
来了解记录数。
正如其他人已经回答的那样,没有迭代直到结束就无法获得行数。 您可以这样做,但您可能不想这样做,请注意以下几点:
-
对于许多RDBMS系统,ResultSet是一个流API,这意味着它不会从数据库服务器加载(甚至可能获取)所有行。 在SO上看到这个问题。 通过迭代到ResultSet的末尾,您可能会显着增加在某些情况下执行所花费的时间。
-
默认的ResultSet对象不可更新,并且只有一个向前移动的游标。 我认为这意味着除非您使用
ResultSet.TYPE_SCROLL_INSENSITIVE
执行查询,否则rSet.beforeFirst()
将抛出SQLException
。 这种方式的原因是因为可滚动游标存在成本。 根据文档,即使您创建可滚动游标,它也可能抛出SQLFeatureNotSupportedException
。 -
填充和返回
List
意味着您还需要额外的内存。 对于非常大的结果集,这根本不起作用。
所以最大的问题是哪个RDBMS? 总而言之,我建议不记录记录数量。
getRow()方法检索当前行号,而不是行数。 因此,在开始迭代ResultSet
, getRow()
返回0。
要获取执行查询后返回的实际行数,没有自由方法:您应该迭代它。
但是,如果您确实需要在处理行之前检索总行数,则可以:
- 则resultset.last()
- ResultSet.getRow()获取总行数
- ResultSet.beforeFirst()
- 正常处理
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()是我访问数据库的代码。 我也被困在这里但后来解决了……