QSqlQuery next / first返回false

时间:2015-01-17 13:49:46

标签: c++ sql qt sqlite

我认为这是一个非常简单的案例,但我不明白为什么会失败。

使用的数据库是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客户端中运行完全相同的查询可以正常工作。

0 个答案:

没有答案