使用 Qt 从 SQLite 中选择

Posted

技术标签:

【中文标题】使用 Qt 从 SQLite 中选择【英文标题】:Select from SQLite with Qt 【发布时间】:2010-02-22 13:49:01 【问题描述】:

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

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

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 

为什么它什么都不选择?我做错了什么?

【问题讨论】:

似乎 .size() 不适用于 Sqlite :( 这就是为什么你有 -1。 【参考方案1】:

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

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

根据你想对你的选择结果做什么,你也可以使用 QSqlQueryModel 代替 QSqlQuery。

【讨论】:

这看起来是个问题。 @vas3k 通常您应该检查 exec() 的返回值以查看查询的执行是否成功。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

这应该可以帮助您调试问题。

【讨论】:

感谢您的回答,是的,我知道。但它输出一个空字符串(只有一个空格): ("lessons", "weeklessons", "weeks") " " -1 您确定查询确实有效吗?从 SQLite 提示符尝试一下。也许在查询末尾添加分号可能会有所帮助?最后,我会尝试让 Qt 附带的 SQLite 示例正常工作。 是的,它适用于我的 SQLite 查看器:lh3.ggpht.com/_hyIyDtqe5N0/S4KNBpfapeI/AAAAAAAAAU0/3MEliEIy8G4/… 添加分号也没有帮助。我在哪里可以找到 Qt SQLite 示例?我只找到了 mysql 这个例子:qt.nokia.com/doc/4.6/sql-sqlwidgetmapper.html 它使用内存中的 SQLite 数据库,但应该很容易重写示例以使用磁盘中的 SQLite 数据库。【参考方案4】:

这可以给你一个答案: http://www.qtcentre.org/threads/7904-Is-there-any-other-reason-why-QSqlQuery-size%28%29-returns-1

【讨论】:

这里的答案被认为是最好的,如果他们不仅提供一个链接(无论多么有用)而且解释问题的原因或描述一个解决方案。您可以随时编辑您的答案以改进它们。【参考方案5】:

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

    query = db.exec("select * from lessons"); 使用数据库连接,并从那里使用executing。 QSqlQuery query( db ); 使用existing database 构造查询,然后执行查询:query.exec("select * from lessons");

编辑: 多读一些后,似乎支持默认连接,所以你的例子应该可以工作......

您可以尝试将查询作为构造函数的值传递吗?也许它会起作用。

QSqlQuery query("select * from lessons");

【讨论】:

Qt 将其设为“默认连接”。是的,我当然试图这样做。不,同样的错误。 db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(文件名);布尔确定 = db.open(); qDebug() 我尝试向构造函数的值添加查询。同样的错误,也不行。很奇怪:(

以上是关于使用 Qt 从 SQLite 中选择的主要内容,如果未能解决你的问题,请参考以下文章

qt中使用sqlite存储数据

如何使用本机 sqlite 库而不是 QSql 从 sqlite 插入和检索 QString

Qt Sqlite 只从脚本创建一张表

Qt SQLITE 查询 QVariant 无效

SQLite3+Qt开发SQLite3简要介绍+在Qt5中的使用步骤

QT5中如何使用SQLite