2013-04-01 53 views
0

我正在使用qt 4.8和psql驱动程序连接到postgres 9.1数据库。qt选择不与where语句工作

我正在做一个通用库来连接并插入数据库;几乎所有方法都已准备就绪,但在最后一个方法中,我需要从表中进行选择以将值插入另一个表中。当我尝试select语句时,它的行为有所不同。根据代码反过来,但没有一个我做的测试导致了一个正确的解决方案。 这里是我的代码:

struct enfriadores enf; 
enf.horaE=time(&enf.horaE); 
enf.horaS=time(&enf.horaS)+1900; 

    //base1.insertaEvento(db,enf); 

QString consulta = "Select id_evento from eventos where extract(epoch from horae)=:hora_bus"; 

QDateTime hora_bus(QDateTime::fromTime_t(enf.horaE)); 

//qDebug()<< enf.horaE; 

QSqlQuery query(db); 
query.prepare(consulta);            
query.bindValue(":hora_bus",hora_bus); 
query.exec(); 
query.first(); 

while(query.next()) 
{ 

    int valor = query.value(0).toInt(); 
    qDebug() << valor << endl; 
} 

的base1.insertaEvento是一类我也插在哪里之后,我需要提取ID表数据的调用。

qDebug() << enf.horaE; 

我把它知道,如果时间是正确的形式之前,我把它附加到查询,顺便说一句,是正确的。 horaE取自我在前面提到的类中声明的结构。

当我运行查询,因为它与它运行良好的while(query.next())但返回任何结果,如果我删除了while循环,但仍维持query.next()编译器返回

QSqlQuery::value: not positioned on a valid record 
0 

我使用query.first尝试()方法和query.setForwardOnly(true),但结果相同。

另外,如果我用qDebug()尝试hora_bus的值并直接在psql控制台中替换它,我会得到一个肯定的匹配,所以问题不在于数据插入或格式化的方式,而是查询的方式检索我相信但不知道如何解决这个 任何想法? 感谢

回答

1

SQL表达式extract(epoch from horae)产生自1970年1月1日以来的秒数,所以这应该传递给参数:hora_bus

QDateTime::fromTime_t(enf.horaE)表明enf.horaE有这个价值,但是的而不是传递加时赛查询,它传递一个QDateTime对象,其文本表示很可能将与年,月,等字符串...这不能比较几秒钟。

那么试试这个来代替:

query.bindValue(":hora_bus",enf.horaE); 

而且代码不应该忽视的prepare()exec()布尔返回值。查询执行失败时,您不希望在结果中尝试循环。

EDIT1: 的确,当传递QDateTime设置为今天与你相似,QSqlQuery::exec()返回false与SQL错误invalid input syntax for type double precision一个准备好的查询。

EDIT2:看来QVariant不支持与long被初始化,显式类型转换到不同类型的支持是必要的。我选择qlonglong一个安全的较大值:

query.bindValue(":hora_bus",(qlonglong)enf.horaE); 

测试,它为我工作。

+0

试过,但我得到了下一个错误: “错误:从'time_t {aka long int}'转换为'const QVariant'是不明确的”,如果我通过QDatetime并检查它的值,它可以正常工作... –

+1

@克罗诺斯:好的,看我的编辑。但是当你说你检查它的值是在你的程序中完成的,而不是在postgresql中。这曾经被转换为一个SQL参数,该值并非您所期望的。 –

0

http://qt-project.org/doc/qt-4.8/qsqlquery.html#details

在文档的最后它提到以下几点:

Warning: You must load the SQL driver and open the connection before a QSqlQuery is created. Also, the connection must remain open while the query exists; otherwise, the behavior of QSqlQuery is undefined.

如果与数据库的连接超时,您使用的变量或一个熄灭的范围,您可能会断开连接并获取未定义的结果。

您还可以检查大部分函数调用的返回值,以查看它们是否成功。

希望有所帮助。

+0

我做phyatt,但我没有表现出来,在此之前,我这样做: QSqlDatabase db = QSqlDatabase :: addDatabase(“QPSQL”); db.setHostName(host); db.setDatabaseName(nombreBD); db.setUserName(usuario); db.setPassword(password); (!db.open()) cout <<“数据库不能打开”; } 之后,我通过数据库到QSqlquery开始连接,是你指的是或我错过了什么? –