【问题标题】:Is there any method to know how many rows Resultset contains? Java and MSSQL有什么方法可以知道Resultset 包含多少行? Java 和 MSSQL
【发布时间】:2012-05-26 22:35:28
【问题描述】:

我想运行一个循环(可能是一段时间)以继续从 MSSQL 获得结果。我已经完成了循环的部分。但是如果没有从 mssql 返回结果(行),可以找到一种方法来停止循环。我的代码是:

String query = "SELECT TOP 1 *  FROM tbl_Url WHERE UrlProcessed = 0";
PreparedStatement preparedquery = con.prepareStatement(query);
ResultSet results = preparedquery.executeQuery();

如果没有返回行,我应该使用什么方法来终止循环。如果从 mssql 返回任何结果或返回行数的方法,Resultset 是否有任何方法返回布尔值。如果没有返回行,则为 0。

【问题讨论】:

    标签: java sql sql-server eclipse jdbc


    【解决方案1】:

    使用 boolean next()
    将光标从其当前位置向前移动一行。 ResultSet 游标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。 当调用 next 方法返回 false 时,光标定位在最后一行之后。

    【讨论】:

      【解决方案2】:

      首先,您必须知道 ResultSet 对象维护一个指向其当前数据行的游标。最初,光标位于第一行之前。 next 方法将光标移动到下一行,因为当 ResultSet 对象中没有更多行时它返回 false,所以可以在 while 循环中使用它来遍历结果集。

      要获得行数,你可以试试这个:

      ResultSet results = preparedquery.executeQuery();
      
      if (!results.next() ) {
      System.out.println("no data");
      }else{
      results.last();
      int rowCount = results.getRow();
      }
      

      【讨论】:

      • 是的,你是对的。但是当我使用 results.last 、 results.isLast() 或 results.first() 等方法时,驱动程序给了我一个例外:The requested operation is not supported on forward only result sets
      • 我首先添加了一个条件,它实际上检查结果集是否不为空。这应该避免任何异常。希望对您有所帮助!
      • 获取行数可能非常昂贵,因为所有行都需要在服务器上进行处理,或者因为 - 此外 - 所有这些行实际上都需要发送到 JDBC 驱动程序。当您只想知道何时停止时,使用next() 作为循环条件是最好的方法。
      • 你说得对,这个问题有两个部分。首先是知道数据集是否为空,如果不是,它包含多少行。我不确定是否有更好的优化来完全涵盖问题的双方并且成本更低。
      • if(!results.next()) 帮助停止了循环
      【解决方案3】:

      如果您只是想找出 while 循环中的结果中是否包含任何行,如果没有则中断,ResultSet.first();会给你这个...

      问。您一次只选择一行是否有充分的理由?

      while(true){
          String query = "Select top 1 * from tbl_Url where UrlProcessed = 0";
          PreparedStatement preparedQuery = con.prepareStatement(query)
          ResultSet results = preparedquery.executeQuery();
          if(!results.first())
              break;
          // process data here...
      }
      

      【讨论】:

      • 但是当我使用 results.last 、 results.isLast() 或 results.first() 等方法时,驱动程序给了我一个例外:The requested operation is not supported on forward only result sets
      • Saad,你正在运行的代码是什么,因为据我所知,ResultSet 总是在返回时将光标放在第一行之前。因此,将 .first() 作为对 ResultSet 的第一个操作将返回 true、(ok) 或 false(无行)...您是否尝试在尝试查看是否有数据之前移动光标?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2012-11-18
      • 2017-03-04
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      相关资源
      最近更新 更多