QSqlQuery::value: not positioned on a valid record

По какой-то причине получаю ошибку в запросе "QSqlQuery::value: not positioned on a valid record".

К базе происходит несколько последовательных запросов в разные таблицы. Запросы к одной из таблиц выдают ошибку.

Скопировав запрос и применив его в MS SQL мы получаем корректный, ожидаемый ответ.

Уже и проверки добавил, и пробовал через seek/last/record/first/next. Лишь из одной таблицы не удаётся получить результат. Теряюсь в догадках.

void DbSqlExport::queryDbResult(QString any){

int iD = 0;

QSqlQuery query;
QString queryString;

QDate curDate = QDate::currentDate();
curDate = curDate.addDays(-1);
QString timeInQuery = curDate.toString("yyyy-MM-dd"); // Разворачиваем формат даты так как в БД.

QSqlRecord rec;
double test;

queryString = "select Val from dbo.PointRatedNIs where  ID_PP = '3481' and DT = '2024-08-12 22:00:00:000' and N_Rate = '1'";

query.exec(queryString);

if (query.isActive())
    qDebug() << "Is Active";
else
    qDebug() << "Not active";

if (query.isSelect())
    qDebug() << "Is Select";
else
    qDebug() << "Not Select";

if (query.last())
{
    rec = query.record();
    test = query.value(rec.indexOf("Val")).toDouble();
    //double test = query.value(0).toDouble();
    qDebug() << "test  " << test;
}
else
    qDebug() << "not work";

qDebug() << "Last error " << query.lastError() << "\n\n";

queryString = "select ID_MeterInfo from MeterInfo where SN = '" + any + "'"; // запрашиваем первичный ID по номеру прибора
query.exec(queryString);

if (query.isActive())
    qDebug() << "Is Active";
else
    qDebug() << "Not active";

if (query.isSelect())
    qDebug() << "Is Select";
else
    qDebug() << "Not Select";

if (query.last())
{
    iD = query.value(0).toInt();
    qDebug() << "iD first  " << iD << "\n\n";
}
else
    qDebug() << "not work";

queryString = "select ID_Point from MeterMountHist where ID_MeterInfo = '" + any.setNum(iD) + "'"; // получаем ID из счётчика

query.exec(queryString);
query.next();
iD = query.value(0).toInt();
qDebug() << "iD second  " << iD;

queryString = "select * from dbo.PointParams where ID_Point = '" + any.setNum(iD) + "' and ID_Param = '4'"; // получаем ID параметра активной энергии счётчика
query.exec(queryString);
query.first();
rec = query.record();
iD = query.value(rec.indexOf("ID_PP")).toInt();
// iD = query.value(0).toInt();
qDebug() << "iD third  " << iD << "\n\n";

if (myParamForSmtp->odbc == "DBEG")
{
    queryString = "select Val from dbo.PointRatedNIs where  ID_PP = '" + any.setNum(iD) + "' and DT = '" + timeInQuery + " 22:00:00:000' and N_Rate = '1'";
    qDebug() << queryString;
}

if (myParamForSmtp->odbc == "DBEN")
    queryString = "select Val from dbo.PointRatedNIs where  ID_PP = '" + any.setNum(iD) + "' and DT = '" + timeInQuery + " 00:00:00:000' and N_Rate = '1'";

query.exec(queryString);
query.next();
day = query.value(0).toString();
qDebug() << "day = " << day;

if (myParamForSmtp->odbc == "DBEG")
    queryString = "select Val from dbo.PointRatedNIs where  ID_PP = '" + any.setNum(iD) + "' and DT = '" + timeInQuery + " 22:00:00:000' and N_Rate = '2'";

if (myParamForSmtp->odbc == "DBEN")
    queryString = "select Val from dbo.PointRatedNIs where  ID_PP = '" + any.setNum(iD) + "' and DT = '" + timeInQuery + " 00:00:00:000' and N_Rate = '2'";

query.exec(queryString);
query.next();
night = query.value(0).toString();
qDebug() << "night = " << night;

Имеем следующий вывод: введите сюда описание изображения

Прикладываю скрин из БД где по этому запросу мы данные получаем:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Anatoly

Пишу ответ на случай, если у кого будет схожая история. Проблема была в настройках учётной записи в SSMS.

Если я правильно помню то не была присвоена толи собственная схема толи членство в настройках пользователя в самой БД. Я правда еще параллельно галочки некоторые поснимал при настройке пользовательского ODBC в администрировании Windows, но сомневаюсь что это повлияло.

→ Ссылка