从Qt中选择SQLite

时间:2010-02-22 13:49:02

标签: c++ sql qt sqlite

我尝试在Linux上的Qt 4.5.3上处理SQLite数据库。我已经创建了数据库。

然后,我尝试在Qt上执行select:

db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(filename); // Here is FULL path to the database. I've checked it twice :)
bool ok = db.open();
qDebug() << db.tables();

QSqlQuery query;
query.exec("select * from lessons");
qDebug() << query.size();
qDebug() << query.isSelect();
qDebug() << query.isValid();

但调试控制台说:

("lessons", "weeklessons", "weeks") 
-1 
true 
false 

为什么选择什么?我做错了什么?

5 个答案:

答案 0 :(得分:9)

如果查询位于有效记录上,则isValid()方法返回true,但在调用exec()之后,它不是:您必须首先移动到有效记录,例如使用query.first()或query.next()。 请参阅Qt docs:http://doc.qt.io/archives/4.6/qsqlquery.html

返回-1的size()并不意味着没有结果:SQLite是查询大小不能直接获得的数据库之一(请参阅QSqlDriver :: hasFeature()的文档)。您可以检查返回的行,并使用循环和query.next()查找大小。

根据您对select的结果要做什么,您也可以使用QSqlQueryModel而不是QSqlQuery。

答案 1 :(得分:3)

在“QSqlQuery查询”中声明,您必须指定数据库连接,例如“QSqlQuery查询(db)”

答案 2 :(得分:1)

鉴于您的程序报告查询无效,请查看错误消息,如下所示:

QDebug() << query.lastError().text();

这可以帮助您调试问题。

答案 3 :(得分:0)

在不了解Qt的情况下,我问自己一个问题:QSqlQuery如何知道使用哪个连接。在手册中查看,基本上有两种可能性来执行查询:

  1. query = db.exec("select * from lessons");
    使用数据库连接,并从那里executing
  2. QSqlQuery query( db );
    使用existing database构建查询,然后执行查询:
    query.exec("select * from lessons");
  3. 编辑:在阅读了一下之后,似乎支持默认连接,因此您的示例应该有效...

    您是否可以尝试将查询作为构造函数的值传递?也许它有效。

    QSqlQuery query("select * from lessons");
    

答案 4 :(得分:0)