2010-02-22 46 views
6

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

然后,我尝试在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 

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

+4

似乎.size()不使用SQLite工作:(这就是为什么你必须-1 – Seba 2011-03-23 20:33:23

回答

0

不知道Qt的情况,我问自己一个问题:QSqlQuery如何知道使用哪个连接。看,截至手册中发现,基本上有两种途径来执行查询:

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

编辑:读多一点之后,似乎默认的连接支持,所以你的榜样应该工作...

你可以尝试传递查询作为构造函数的值吗?也许它可以工作。

QSqlQuery query("select * from lessons"); 
+0

的Qt使得它为“默认连接”是的。 ,当然我试图这样做。不,同样的错误。 db = QSqlDatabase :: addDatabase(“QSQLITE”); db。setDatabaseName(文件名); bool ok = db.open(); qDebug()<< db.tables(); QSqlQuery query = db.exec(“select * from lessons”); qDebug()<< query.size(); 输出: (“lesson”,“weeklessons”,“weeks”) -1 – vas3k 2010-02-22 14:01:08

+0

我尝试将查询添加到构造函数的值中。同样的错误,不要工作。非常奇怪:( – vas3k 2010-02-22 14:05:29

3

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

1

鉴于你的程序报告查询是无效的,看看错误信息如下:

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

这会帮助你在调试问题。

+0

Thanx的答案,是的,我知道,但它输出一个空字符串(只有一个空格):(“lesson”,“weeklessons”,“weeks”) “” -1 – vas3k 2010-02-24 11:54:14

+0

你确定查询实际上起作用了吗?在SQLite提示符下试一试,也许在查询结束时添加一个分号可能会有帮助吗?最后,我会尝试获取随Qt一起发布的SQLite示例。 – 2010-02-24 12:46:08

+0

是的,它适用于我的SQLite查看器:http://lh3.ggpht.com/_hyIyDtqe5N0/S4KNBpfapeI/AAAAAAAAAU0/3MEliEIy8G4/sqlite2.png 添加分号也没有帮助。我在哪里可以找到Qt SQLite示例?我只找到MySQL。 – vas3k 2010-02-24 14:03:56

9

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

size()返回-1并不表示没有结果:SQLite是查询大小不直接可用的数据库之一(请参见QSqlDriver的文档:: hasFeature())。您可以检查是否返回了行,并通过循环和query.next()来查找大小。

根据您对选择结果所做的操作,您也可以使用QSqlQueryModel而不是QSqlQuery。

+0

看起来像这个问题。一般来说,@ vas3k应该检查exec()的返回值,以查看查询成功的执行情况。 – 2010-04-16 14:37:54