首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTSql查询中无结果

QTSql查询中无结果
EN

Stack Overflow用户
提问于 2021-10-12 08:48:12
回答 1查看 37关注 0票数 1

我已经创建了一个函数来执行对postgresql数据库的查询。我使用查询字符串、一个布尔值和一个错误字符串调用函数,以便告诉我查询是否正确。如果我尝试一个正确的查询(在postgresql提示符中测试),我不会进入xQueryResult.next()循环,但是xQueryResult不是空的。我使用c++17,postgresql数据库和QTSql库(Qt5.15)

代码语言:javascript
复制
#include "SqlDatabase.h"
#include <QtSql\QSqlError>
#include <QtSql\QSqlQuery>
#include <QtSql/QSqlRecord>
#include <QJsonObject>
#include <QJsonArray>


QJsonDocument SqlDatabase::fun(const QString &i_xQuery, bool& bOk, QString& strErrorMessage)
{
    QJsonDocument xJsonDoc;
    QSqlQuery xQueryResult = m_pxCurrentDatabase->exec(i_xQuery);

    if (QSqlError::NoError != xQueryResult.lastError().type())
    {
        bOk = false;
        strErrorMessage = QString("%1: %2").arg(__FUNCTION__).arg(xQueryResult.lastError().text());
        return xJsonDoc;
    }

    QJsonArray xRecordsArray;
    int iFieldIndex = 0;
    int iFieldCount = 0;
    xQueryResult.first();
    while (true == 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(xSqlRecord.value(iFieldIndex));
        }

        xRecordsArray.append(xJsonObj);
    }

    QJsonObject xObject;
    xObject["Records"] = xRecordsArray;
    xObject["NumRowsAffected"] = xQueryResult.numRowsAffected();
    xObject["LastInsertId"] = xQueryResult.lastInsertId().toString();
    xJsonDoc.setObject(xObject);

    bOk = true;
    strErrorMessage = "";
    return xJsonDoc;
}

我从main调用函数,使用

代码语言:javascript
复制
 QJsonDocument xResultDoc;
 std::unique_ptr<Exercise::Comm::SqlDatabase> m_pxDatabase;
QString strQuery = "INSERT INTO public.tab1 (id,name_id,descr_id,description,"user") 
VALUES (
'test',
'$Default',
0,
'test',
''
)RETURNING id;"
  bool bOk;
  QString strErrorMessage;
xResultDoc = m_pxDatabase->exec2(strQuery, bOk, strErrorMessage);
EN

回答 1

Stack Overflow用户

发布于 2021-11-06 00:13:07

您不需要先调用(),然后再调用next(),只需调用next()即可。在你的代码中,来自PG的第一个结果总是被吃掉。因此,如果您的查询包含一个结果,则不会进入循环

代码语言:javascript
复制
#include "SqlDatabase.h"
#include <QtSql\QSqlError>
#include <QtSql\QSqlQuery>
#include <QtSql/QSqlRecord>
#include <QJsonObject>
#include <QJsonArray>


QJsonDocument SqlDatabase::fun(const QString &i_xQuery, bool& bOk, QString& strErrorMessage)
{
    QJsonDocument xJsonDoc;
    QSqlQuery xQueryResult = m_pxCurrentDatabase->exec(i_xQuery);

    if (QSqlError::NoError != xQueryResult.lastError().type())
    {
        bOk = false;
        strErrorMessage = QString("%1: %2").arg(__FUNCTION__).arg(xQueryResult.lastError().text());
        return xJsonDoc;
    }

    QJsonArray xRecordsArray;
    int iFieldIndex = 0;
    int iFieldCount = 0;
    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(xSqlRecord.value(iFieldIndex));
        }

        xRecordsArray.append(xJsonObj);
    }

    QJsonObject xObject;
    xObject["Records"] = xRecordsArray;
    xObject["NumRowsAffected"] = xQueryResult.numRowsAffected();
    xObject["LastInsertId"] = xQueryResult.lastInsertId().toString();
    xJsonDoc.setObject(xObject);

    bOk = true;
    strErrorMessage = "";
    return xJsonDoc;
}

另外,使用像这样的xObject["LastInsertId"] = xQueryResult.lastInsertId().toString();代码是非常危险的

  1. 当while循环结束时,结果定位在最后一条记录之后,返回QT documentation

。如果插入多个行,则行为为undefined

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69537561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档