使用 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 中选择的主要内容,如果未能解决你的问题,请参考以下文章
如何使用本机 sqlite 库而不是 QSql 从 sqlite 插入和检索 QString