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 шт):
Пишу ответ на случай, если у кого будет схожая история. Проблема была в настройках учётной записи в SSMS.
Если я правильно помню то не была присвоена толи собственная схема толи членство в настройках пользователя в самой БД. Я правда еще параллельно галочки некоторые поснимал при настройке пользовательского ODBC в администрировании Windows, но сомневаюсь что это повлияло.