我遇到的问题类似于我见过的一些问题,但解决方案对我来说似乎不起作用,所以我会添加一个新的:
我正在尝试从SQLite表访问我的QT程序中的数值(最高用户ID),并使用以下查询:
SELECT Name, MAX(ID) FROM User_lib;
这适用于命令shell,具有预期的结果。
然后我尝试使用以下方法访问最大ID值:
QSqlQuery qry_ID;
qry_ID.prepare("SELECT Name, MAX(User_lib.ID) FROM User_lib");
qry_ID.exec()
qDebug() << qry_ID.record().value("ID").toInt();
结果为零(如果我使用toString()
)
另外,作为测试
qDebug() << "Number of Rows: " << qry_ID.size();
我在其他几个答案中看到的给了我-1。 另一方面,
qDebug() << "Number of columns: " << qry_ID.record().count();
按预期给出“列数2”。看来查询没有结果。
起初我认为我的查询有问题,但是当我尝试计算明显正常工作的查询中的行(显示表格,我可以正确添加元素等)时会发生同样的事情,所以我想我必须在QT做错事。
答案 0 :(得分:1)
让我们看一下你在命令行shell中实际获得的内容:
sqlite> .mode columns sqlite> .header on sqlite> SELECT Name, MAX(ID) FROM User_lib; Name MAX(ID) ---------- ---------- user30248 8562493
因此,在您从查询中获得的输出中,第二列未命名为ID
,而是MAX(ID)
。
documentation实际上说:
如果存在AS子句,则结果列的名称是该列的“AS”子句的值。如果没有AS子句,那么列的名称是未指定的,可能会从SQLite的一个版本更改为下一个。
因此请使用AS
,或按索引访问该列。
SQLite根据需要计算输出行,因此在读取所有行之前无法计算行数。因此,SQLite驱动程序不支持the QuerySize
feature。
答案 1 :(得分:0)
我上面没有检查过CL的答案,我相信它也会起作用,但我设法找到了一个对我有用的替代解决方案,可能很有趣。由于QsqlQuery的内部指针设置为第一个记录之前的一个字段,因此我必须使用next。这是有效的代码:
QSqlQuery qry_ID;
qry_ID.prepare("SELECT Name, MAX(ID) FROM User_lib");
qry_ID.exec();
qry_ID.next();
QString name = qry_ID.value(0).toString();
int IDmax = qry_ID.value(1).toInt();
如果您需要访问各种行,则需要while循环,但这是一个不同的问题。