【问题标题】:Total Number of Row Resultset getRow Method总行数结果集 getRow 方法
【发布时间】:2011-11-24 15:21:30
【问题描述】:

阅读以下代码:

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 在 jTable 中显示 4 条记录,但总数 = 0;当我通过调试评估时,它显示:

total=(int)0; 

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

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

然后 total 显示准确的值 = 4 但 rSet 不返回任何内容。那么 jTable 是空的。 更新我!

【问题讨论】:

  • 因为totalrec从未被使用过?

标签: java jdbc


【解决方案1】:

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

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

 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);
    }

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      BalusC 的回答是对的!但我要根据用户实例变量提一下如:

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

      然后你错过了什么

      rSet.beforeFirst();
      

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

      【讨论】:

      • 你应该提到rSet.last() 可以抛出如果rSet 类型是TYPE_FORWARD_ONLY oracle docs
      【解决方案4】:

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

      private int num_rows;
      

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

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

      就是这样

      【讨论】:

        【解决方案5】:

        正如其他人所回答的那样,如果不迭代到最后,就无法获得行数。您可以这样做,但您可能不想这样做,请注意以下几点:

        1. 对于许多 RDBMS 系统,ResultSet 是一个流式 API,这意味着 它不会从 数据库服务器。请参阅关于 SO 的this 问题。通过迭代到 在 ResultSet 结束时,您可能会显着增加 在某些情况下执行。

        2. 默认的ResultSet 对象不可更新且具有游标 只向前移动。我认为这意味着除非你 执行 带有ResultSet.TYPE_SCROLL_INSENSITIVE rSet.beforeFirst() 的查询将抛出 SQLException。之所以这样,是因为有成本 带有可滚动光标。根据文档,即使您创建了可滚动光标,它也可能会抛出 SQLFeatureNotSupportedException

        3. 填充并返回 List<Operations> 意味着您将 还需要额外的内存。对于非常大的结果集,这不会 工作 完全没有。

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

        【讨论】:

          【解决方案6】:

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

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

          然而,如果您真的需要在处理它们之前检索总行数,您可以:

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

          【讨论】:

            【解决方案7】:

            在返回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()就可以知道记录的数量。

            【讨论】:

              【解决方案8】:

              如果不遍历它,您将无法获得 ResultSet 中返回的行数。为什么你要返回一个 ResultSet 而不遍历它?首先执行查询是没有意义的。

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

              【讨论】:

                【解决方案9】:

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

                ResultSet.getRow()

                检索当前行号。

                其次,你输出totalrec,但从不分配任何东西给它。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-07-20
                  • 2013-06-29
                  • 2017-03-13
                  相关资源
                  最近更新 更多