QSqlRecord:在QT中访问SQLite表中的数值,结果为空

时间:2017-09-05 09:03:41

标签: mysql qt sqlite record

我遇到的问题类似于我见过的一些问题,但解决方案对我来说似乎不起作用,所以我会添加一个新的:

我正在尝试从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做错事。

2 个答案:

答案 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循环,但这是一个不同的问题。