我已经创建了一个函数来执行对postgresql数据库的查询。我使用查询字符串、一个布尔值和一个错误字符串调用函数,以便告诉我查询是否正确。如果我尝试一个正确的查询(在postgresql提示符中测试),我不会进入xQueryResult.next()循环,但是xQueryResult不是空的。我使用c++17,postgresql数据库和QTSql库(Qt5.15)
#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调用函数,使用
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);发布于 2021-11-06 00:13:07
您不需要先调用(),然后再调用next(),只需调用next()即可。在你的代码中,来自PG的第一个结果总是被吃掉。因此,如果您的查询包含一个结果,则不会进入循环
#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();代码是非常危险的
。如果插入多个行,则行为为undefined
https://stackoverflow.com/questions/69537561
复制相似问题