qt选择不使用where语句

时间:2013-04-01 01:05:42

标签: sql postgresql qt qsqlquery qtsql

我使用qt 4.8和psql驱动程序连接到postgres 9.1数据库。

我正在做一个连接并插入数据库的通用库;几乎所有的方法都准备好了,但在最后一个方法中,我需要从表中选择一个值来插入另一个。当我尝试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控制台中替换它,我得到一个肯定的匹配,所以问题不在于插入或格式化数据的方式,它会妨碍查询被检索我相信但不知道如何解决这个问题 有任何想法吗? 感谢

2 个答案:

答案 0 :(得分:1)

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

QDateTime::fromTime_t(enf.horaE)表示enf.horaE具有此值,但不是将ot传递给查询,而是传递一个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);

经过测试,它对我有用。

答案 1 :(得分:0)

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

在文档的最后,它提到了以下内容:

  

警告:您必须在创建QSqlQuery之前加载SQL驱动程序并打开连接。此外,在查询存在时,连接必须保持打开状态;否则,QSqlQuery的行为是未定义的。

如果与数据库的连接超时,或者您使用的某个变量超出范围,则可能会提前断开连接并获得未定义的结果。

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

希望有所帮助。