从Qt中选择SQLite

vas*_*s3k 6 c++ sql sqlite qt

我尝试在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();
Run Code Online (Sandbox Code Playgroud)

但调试控制台说:

("lessons", "weeklessons", "weeks") 
-1 
true 
false 
Run Code Online (Sandbox Code Playgroud)

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

Lei*_*iaz 9

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

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

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


pok*_*oke 0

在对 Qt 了解不多的情况下,我问自己一个问题:QSqlQuery要使用哪个连接。查看手册发现执行查询基本上有两种可能性:

\n\n
    \n
  1. query = db.exec("select * from lessons");
    \n使用数据库连接,并执行从那里
  2. \n
  3. QSqlQuery query( db );
    \n使用现有数据库构造查询,然后执行查询:
    \nquery.exec("select * from lessons");
  4. \n
\n\n

编辑:阅读更多内容后,似乎支持默认连接,因此您的示例应该可以工作\xe2\x80\xa6

\n\n

您可以尝试将查询作为构造函数的值传递吗?也许那时它就有效了。

\n\n
QSqlQuery query("select * from lessons");\n
Run Code Online (Sandbox Code Playgroud)\n