2017-09-05 23 views
0

我有类似于我见过的一些问题,但解决方案似乎不适合我,所以我会添加一个新的之一:QSqlRecord:从QT中的SQLite表访问数值,结果为空

我想从一个SQLite访问表的数值(最高的用户ID)到我的QT程序,用下面的查询:

SELECT Name, MAX(ID) FROM User_lib; 

这个工作从命令外壳,与预期结果。

然后我尝试与访问最大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

如何获得'qry_ID'值? – vahancho

+0

这是查询名称:qry_ID.prepare(“SELECT Name,MAX(User_lib.ID)FROM User_lib”);将相应地编辑我的问题。 – user30248

+0

但你执行它?如果是,如何?请展示更多代码。 – vahancho

回答

0

我还没有检查过上面的CL的答案,我相信它也能工作,但我设法找到了替代解决方案,对我来说很有用,而且可能很有趣。由于QsqlQuery的内部指针设置为第一条记录之前的一个字段,因此我必须继续前进。这是工作的代码:

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

1

让我们来看看你在命令行shell真正得到:

 
sqlite> .mode columns 
sqlite> .header on 
sqlite> SELECT Name, MAX(ID) FROM User_lib; 
Name  MAX(ID) 
---------- ---------- 
user30248 8562493 

所以在你从查询得到的输出,第二列是未命名IDMAX(ID)

documentation居然说:

结果列的名称是该列的“AS”条款的评估,如果有一个AS子句。如果没有AS子句,那么列的名称是未指定的,并可能从一个SQLite版本更改为下一个。

因此使用AS,或通过其索引访问列。


SQLite的按需计算输出行,所以不可能给行的总数已经全部读取之前。因此,SQLite驱动程序不支持the QuerySize feature