0

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

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

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 控制台中替换它,我会得到一个肯定的匹配,所以问题不在于插入或格式化数据的方式,而是检索查询的方式我相信但是不知道如何解决这个有什么想法吗?谢谢

4

2 回答 2

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()and的布尔返回值exec()。当查询执行失败时,您不想尝试在结果中循环。

EDIT1:确实,当将设置为今天的 QDateTime 传递给与您类似的准备好的查询时, QSqlQuery::exec()返回 false 并带有 SQL 错误invalid input syntax for type double precision

EDIT2:它似乎QVariant不支持使用 a 进行初始化,long因此需要显式强制转换为不同的支持类型。我选择qlonglong了一个更大的安全值:

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

经过测试,它对我有用。

于 2013-04-01T12:25:59.047 回答
0

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

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

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

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

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

希望有帮助。

于 2013-04-01T05:24:28.660 回答