QSqlQuery size() 始终返回 -1

问题描述 投票:0回答:4
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。请帮助。谢谢。

c++ sql qt sqlite qsqlquery
4个回答
14
投票
SQLite 不支持

query.size()
。但您可以通过解决方法获取行数。
QSqlQuery::last ()
检索结果中的最后一条记录(如果有),并将查询定位在检索到的记录上。调用
last()
后,您可以检索最后一条记录的索引,并使用
first()
previous()
:

将查询定位在第一条记录之前
int numberOfRows = 0;
if(qry.last())
{
    numberOfRows =  qry.at() + 1;
    qry.first();
    qry.previous(); 
}

4
投票

来自医生:

返回结果的大小(返回的行数),如果满足则返回 -1 无法确定大小或数据库不支持 报告有关查询大小的信息。请注意,对于非 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


2
投票

我自己使用这个功能

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

0
投票

我在qt5中使用qsqlite时遇到同样的问题。 query.size总是返回-1,所以我使用query.first()代替。

QString username = ui->usernameInput->text();
QString password = ui->passwordInput->text();
QString command = "SELECT * FROM user WHERE username = '" + username + "' AND password = '" + password + "'";
QSqlQuery query;
if (query.exec(command)) {
    qDebug() << query.size(); // the size will always -1 when using QSqlite
    if (query.first()) { // so i use query.first() to check if there has any result
        QMessageBox::information(this, "Login success.", "You have successfully logged in!");
    } else {
        QMessageBox::information(this, "Login failed.", "Please Check the username and password");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.