You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt 5.15 QTSql执行PostgreSQL正确查询无法进入xQueryResult.next()循环问题

问题根因

1. 游标位置逻辑错误

你在遍历结果集前额外调用了xQueryResult.first():

  • 对于带RETURNING的INSERT语句,执行成功后只会返回1条记录
  • QSqlQuery执行完带返回结果的语句后,游标默认位于第一条记录之前的位置
  • first()会直接把游标移动到第一条记录的位置,紧接着调用next()会把游标往后再移一位,指向不存在的第二条记录,next()返回false,自然不会进入循环。

2. 方法名映射问题

你贴出的类实现方法名为fun(),但调用时用的是exec2(),需要确认exec2()的实现就是你贴出的这段代码,避免调用错方法。

修复方案

直接删除xQueryResult.first()这一行即可,正确的遍历逻辑如下:

QJsonArray xRecordsArray;
int iFieldIndex = 0;
int iFieldCount = 0;
// 移除多余的xQueryResult.first()调用
while (xQueryResult.next())
{
    const QSqlRecord& xSqlRecord = xQueryResult.record();
    QJsonObject xJsonObj;

    if (iFieldCount == 0)
        iFieldCount = xSqlRecord.count();

    for (iFieldIndex = 0; iFieldIndex < iFieldCount; iFieldIndex++)
    {
        QString strKey = xSqlRecord.fieldName(iFieldIndex);
        xJsonObj[strKey] = QJsonValue::fromVariant(xQueryResult.value(iFieldIndex));
    }

    xRecordsArray.append(xJsonObj);
}

调试验证建议

可以在遍历前添加打印语句确认结果集大小:

qDebug() << "结果集行数:" << xQueryResult.size();

如果输出为1,说明RETURNING的结果已经正常返回,修改游标逻辑后就能正常拿到返回的id值。

内容的提问来源于stack exchange,提问作者jerloi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:36:01