行结果集getRow方法的总数

时间:2011-09-25 13:34:23

标签: java jdbc

阅读以下代码:

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是空的。 更新我!

9 个答案:

答案 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)

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

  1. 对于许多RDBMS系统,ResultSet是一个流API,这意味着 它没有加载(或甚至可以获取)来自的所有行 数据库服务器请参阅有关SO的this问题。通过迭代到 ResultSet的结尾可能会显着增加所需的时间 在某些情况下执行。

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

  3. 填充并返回List<Operations>表示您愿意     还需要额外的记忆。对于非常大的结果集,这不会 工作     完全没有。

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

答案 3 :(得分:2)

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

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

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

  1. ResultSet.last()
  2. ResultSet.getRow()获取总行数
  3. ResultSet.beforeFirst()
  4. 正常处理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)

getRow()方法在查询后总是会产生0:

  

ResultSet.getRow()

     

检索当前行号。

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

答案 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()是我访问数据库的代码。 我也被困在这里但后来解决了......