【问题标题】:QSqlQuery size() always returns -1QSqlQuery size() 总是返回 -1
【发布时间】:2014-12-17 04:05:58
【问题描述】:
QSqlQuery query;
QString queryText("SELECT * FROM section");
query.exec(queryText);
qDebug() << query.size(); //always -1
while (query.next()) qDebug() << query.value(0).toString(); //got 16 records

方法size() 总是返回-1。请帮忙。谢谢。

【问题讨论】:

  • 没有错误,isActive() == true,query.exec == true。

标签: c++ sql qt sqlite qsqlquery


【解决方案1】:

query.size() 不支持 SQLite。但是您可以通过变通方法获得行数。 QSqlQuery::last () 检索结果中的最后一条记录(如果可用),并将查询定位在检索到的记录上。调用last() 后,您可以检索最后一条记录的索引,并使用first()previous() 将查询定位在第一条记录之前:

int numberOfRows = 0;
if(qry.last())
{
    numberOfRows =  qry.at() + 1;
    qry.first();
    qry.previous(); 
}

【讨论】:

  • 我也得到了 QODBC(通过数据源的 MS SQL)结果的这个结果
【解决方案2】:

来自文档:

返回结果的大小(返回的行数),如果 大小无法确定或数据库不支持 报告有关查询大小的信息。请注意,对于非 SELECT 语句(isSelect() 返回 false),size() 将返回 -1。如果 查询未激活(isActive() 返回 false),返回 -1。

要确定受非 SELECT 语句影响的行数, 使用 numRowsAffected()。

http://qt-project.org/doc/qt-4.8/qsqlquery.html#size

您的查询isSelect 处于活动状态,但 SQLite 是无法直接获得查询大小的数据库之一。

举个例子来证明:

qDebug() <<db.driver()->hasFeature(QSqlDriver::QuerySize);

它返回false

【讨论】:

  • 谢谢,但是我怎样才能得到行数呢?
  • @Efog 我不知道你的具体任务,但如果你想确定大小,那么你不能这样做,如果你以后需要行数,你可以使用额外的 int 变量作为计数器并使用它,但 sqlite 在这里帮不了你。
【解决方案3】:

我自己使用这个功能

int sqlSize(QSqlQuery query)
{
    int initialPos = query.at();
    // Very strange but for no records .at() returns -2
    int pos = 0;
    if (query.last())
        pos = query.at() + 1;
    else
        pos = 0;
    // Important to restore initial pos
    query.seek(initialPos);
    return pos;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2019-10-10
    • 2014-04-13
    • 2017-03-20
    相关资源
    最近更新 更多