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
相关产品推荐
相关产品推荐

