我使用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控制台中替换它,我得到一个肯定的匹配,所以问题不在于插入或格式化数据的方式,它会妨碍查询被检索我相信但不知道如何解决这个问题 有任何想法吗? 感谢
答案 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的行为是未定义的。
如果与数据库的连接超时,或者您使用的某个变量超出范围,则可能会提前断开连接并获得未定义的结果。
您还可以检查大多数函数调用的返回值,看它们是否成功。
希望有所帮助。