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。请帮助。谢谢。
query.size()
。但您可以通过解决方法获取行数。 QSqlQuery::last ()
检索结果中的最后一条记录(如果有),并将查询定位在检索到的记录上。调用 last()
后,您可以检索最后一条记录的索引,并使用 first()
和 previous()
: 将查询定位在第一条记录之前
int numberOfRows = 0;
if(qry.last())
{
numberOfRows = qry.at() + 1;
qry.first();
qry.previous();
}
来自医生:
返回结果的大小(返回的行数),如果满足则返回 -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
我自己使用这个功能
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;
}
我在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");
}
}