我认为这是一个非常简单的案例,但我不明白为什么会失败。
使用的数据库是sqlite3,linux平台。 Qt 5.3。
我有这张桌子:CREATE TABLE db_info (name TEXT, value TEXT);
包含此数据(来自sqlite3客户端的输出):
version|1
created|2015-01-16 11:06:12
是的,这很简单。
目的是检查是否使用其他版本的应用程序创建了数据库。所以我将DB中的版本与代码中的编译常量进行比较。
因此,在启动期间,我这样做(为简洁而修剪):
_db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", "mydb"));
_db->setDatabaseName(dbFile);
_db->open();
QSqlQuery query(*_db);
query.prepare("SELECT value FROM db_info WHERE name = 'version' AND value = :version");
query.bindValue(":version", DB_VERSION);
query.exec();
if(query.first())
// same version
else
// some other version
不是很复杂的东西...... 现在针对具体问题:
_db->open()
返回true
query.prepare()
返回true
query.isSelect()
返回true
query.exec()
返回true
exec()
之后:
query.isActive()
返回true
query.size()
返回-1
query.first()
或query.next()
返回false
可能是什么问题?
根据dox(http://doc.qt.io/qt-5/qsqlquery.html#first),如果查询未处于活动状态或{}不是select,则first()
返回false,因此不能为它。
但我想,因为size()
返回-1,所以肯定会出现某些问题......
我已尝试向lastError()
添加一些调用,但它始终为空。来自query
和_db
。还有其他一些方法可以从数据库或驱动程序中获取一些消息吗?
我也尝试删除WHERE
子句。没有区别。
在sqlite3
客户端中运行完全相同的查询可以正常工作。