阅读以下代码:
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;
而不是total =(int)4 如果我使用
rSet=last(); above from the code total = rSet.getRow();
然后总计显示准确值= 4但是rSet什么都不返回。然后jTable是空的。 更新我!
答案 0 :(得分:24)
BalusC的回答是对的!但我必须根据用户实例变量提及,例如:
rSet.last();
total = rSet.getRow();
然后你缺少
rSet.beforeFirst();
剩下的代码是一样的,你会得到你想要的结果。
答案 1 :(得分:16)
在返回ResultSet
对象之前,需要调用ResultSet#beforeFirst()
将光标放回第一行之前。通过这种方式,用户将能够以通常的方式使用next()
。
resultSet.last();
rows = resultSet.getRow();
resultSet.beforeFirst();
return resultSet;
但是,到目前为止给出的代码存在更大的问题。它正在泄漏数据库资源,它也不是一个合适的OOP方法。查找DAO模式。最终你想最终成为
public List<Operations> list() throws SQLException {
// Declare Connection, Statement, ResultSet, List<Operation>.
try {
// Use Connection, Statement, ResultSet.
while (resultSet.next()) {
// Add new Operation to list.
}
} finally {
// Close ResultSet, Statement, Connection.
}
return list;
}
这样调用者只需使用List#size()
来了解记录数。
答案 2 :(得分:3)
正如其他人已经回答的那样,没有迭代直到结束就无法获得行数。你可以这样做,但你可能不想这样做,请注意以下几点:
对于许多RDBMS系统,ResultSet是一个流API,这意味着 它没有加载(或甚至可以获取)来自的所有行 数据库服务器请参阅有关SO的this问题。通过迭代到 ResultSet的结尾可能会显着增加所需的时间 在某些情况下执行。
默认的ResultSet对象不可更新并且有一个游标
只向前推进我认为这意味着除非你
执行
ResultSet.TYPE_SCROLL_INSENSITIVE
rSet.beforeFirst()
的查询将抛出
SQLException
。这种方式的原因是因为有成本
用可滚动的光标。根据文档,即使您创建了一个可滚动的游标,它也可能会抛出SQLFeatureNotSupportedException
。
填充并返回List<Operations>
表示您愿意
还需要额外的记忆。对于非常大的结果集,这不会
工作
完全没有。
所以最重要的问题是哪个RDBMS? 总而言之,我建议不记录记录数量。
答案 3 :(得分:2)
getRow()方法检索当前行号,而不是行数。因此,在开始迭代ResultSet
之前,getRow()
返回0。
要获取执行查询后返回的实际行数,没有 free 方法:您应该迭代它。
然而,如果确实需要在处理之前检索总行数,您可以:
ResultSet
答案 4 :(得分:2)
更好的方法是使用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);
}
答案 5 :(得分:0)
答案 6 :(得分:0)
如果不迭代,则无法获取ResultSet中返回的行数。为什么在不迭代的情况下返回ResultSet呢?首先执行查询没有意义。
更好的解决方案是将持久性与视图分开。创建一个单独的数据访问对象,为您处理所有数据库查询。让它获取要在JTable
中显示的值,将它们加载到数据结构中,然后将其返回到UI进行显示。用户界面将拥有它所需的所有信息。
答案 7 :(得分:0)
我已经解决了这个问题。我唯一做的是:
private int num_rows;
然后在使用结果集的方法中放入此代码
while (this.rs.next())
{
this.num_rows++;
}
这就是全部
答案 8 :(得分:0)
从结果集中获取行数的最佳方法是使用 count 函数查询进行数据库访问,然后使用 rs.getInt(1)方法获取行数。 从我的代码看:
String query = "SELECT COUNT() FROM table";
ResultSet rs = new DatabaseConnection().selectData(query);
rs.getInt(1);
这将返回从数据库中获取的行的int值。 这里DatabaseConnection()。selectData()是我访问数据库的代码。 我也被困在这里但后来解决了......