【问题标题】:Resultset returns 160 but database returns 44 rows; WHY结果集返回 160 但数据库返回 44 行;为什么
【发布时间】:2016-11-24 17:16:22
【问题描述】:

我正在查询我的 SQL 数据库,发现当我请求 160 行,而数据库只有 44 行时,ResultSet 返回 160 行。发生这种情况时,前 44 行具有实际有用的数值,其余 116 行具有全部为 0 的值。如何让ResultSet 仅包含或向我提供从数据库查询返回的 44 行?这是代码片段:

statement = connection.createStatement();

query = "SELECT " + "Close" + ", Volume" + " FROM source_data_manager.TradingData_daily WHERE Exchange = '" + exchange + 
   "' and Symbol = '" + symbol + "' order by EntryID DESC limit " + 160 + ";";

//Execute the query
resultSet = statement.executeQuery(query);
//Loop through the results
int    count  = 0;
while (resultSet.next())
{
   valuesRetrieved[count++] = resultSet.getDouble(1);
   volume += resultSet.getLong(2);
}

退出这个循环,count 等于160,但应该等于44。数组valuesRetrieved[] 有 44 个实际可用值元素,其余 114 个值均为零 (0)。数组中应该只有 44 个值。

【问题讨论】:

  • 你用的是什么数据库之王?
  • 直接对数据库运行查询,看看你得到了多少行。
  • 告诉我们你是如何声明valuesRetrieved的,如果你声明使用double[] valuesRetrieved = new double[160],你的尾随0来自它而不是你的查询结果
  • 顺便说一句,剩下的应该是 116 而不是 114
  • 我正在使用用于 Java 的 SQL 库,它是 netbeans IDE 的“默认”。

标签: java sql resultset


【解决方案1】:

尝试使用Statement.setMaxRows

void setMaxRows(int max) throws SQLException;

setMaxRows 的优点是可以创建通用语句,适用于 Postgres、Oracle、Mysql 等。

其实Oracle是用ROWNUM语法,postgres-LIMIT,msqsql-TOP

【讨论】:

    【解决方案2】:

    这很奇怪,可能是驱动程序对限制而不获取大小的特定反应? 对于空行,resultSet.isAfterLast()return 会是什么?

    【讨论】:

      【解决方案3】:

      感谢大家的回复。 Nicholas Filotto 给出了正确的答案。在方法的顶部是 valuesRetrieved 的声明,如下所示:

      double [] valuesReceived = new double [160];

      不使用语句解决了问题:

      valuesReceived[count++] = resultSet.getDouble(1);

      还有一个额外的特点。我一定不明白 getFetchSize() 做了什么,因为声明:

      int xxx = resultSet.getFetchSize();

      总是将 0 分配给 xxx.... 不太明白为什么。

      【讨论】:

        猜你喜欢
        • 2016-07-03
        • 1970-01-01
        • 2011-08-07
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 2010-10-29
        • 1970-01-01
        相关资源
        最近更新 更多