Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 07.04.2020
Сообщений: 22

Почему "иногда" объект QSqlQuery теряет результаты запроса после работы другого объекта QSqlQuery?

07.04.2020, 19:34. Показов 2834. Ответов 21

Студворк — интернет-сервис помощи студентам
Была некоторая функция:
C++ (Qt)
1
bool Class::func(QSqlQuery& query /*...*/);
Внутри выполнялся некоторый запрос (достаточно большой). SQLite

Всё было хорошо, но я решил усложнить жизнь (не ради забавы конечно). Поскольку запрос становился ещё более сложным, решил использовать временные таблицы, которые получал вызовом другой функции, по сути перенеся всё усложнение в функцию,создающую временную таблицу.

Итак, запрос использует временную таблицу, результаты запроса обрабатываются, как видно из объявления функции, извне. Не есть гуд, наверное, но у меня пока так.

После выполнения запроса пытаюсь удалить временную таблицу. Говорит - залочена. Но мне её нужно удалить, потому что в следующий раз при вызове моей функции она будет заполняться другими данными. Да и зачем мне ненужные данные...

Тогда я решил не таблицу удалять, а все записи из неё. ...сразу надо было.

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

Ок, в очередной раз убеждаюсь в правильности создания временной таблицы.

В итоге понимаю, что если я обхожу результаты запроса до удаления временной таблицы, данные не теряются и я могу точно также обойти результаты запросы после удаления временной таблицы. В противном случае в результатах запроса остаётся всего одна запись.

Причём, если я обхожу не все результаты,а только часть, то сохранной остаётся только эта часть.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    bool b = query.exec(queryStr);  //основной запрос
    qDebug()<< query.lastQuery();
 
    if (!b)
    {
        logError() << "Вроде, не удается сформировать словаричек!";
        qDebug() << query.lastError();
        qDebug()<< query.lastQuery();
 
    }
 
    if (true)
    {
        if (query.first()) while (query.next()); // обход, без которого данные теряются
        //for (int cnt = 0; query.next() && (cnt < 5); cnt++);
    }
 
    dropTempTableOfElems(); // удаление данных из временной таблицы
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool Class::dropTempTableOfElems()
{
    QSqlQuery query(dbase);
    QString queryStr =
            "DELETE FROM temp_elems ; ";
            //"DROP TABLE IF EXISTS temp_elems ; ";
    bool b = query.exec(queryStr);
 
    if (!b)
    {
        qDebug() << "Вроде, не удается удалить временную таблицу всех элементов !";
        qDebug() << query.lastError();
        qDebug()<< query.lastQuery();
        return false;
    }
 
    return true;
}
Всё хорошо, но в коде появился неприятный костыль и его нужно убирать....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2020, 19:34
Ответы с готовыми решениями:

QSqlQuery query, ошибка "Aggregate 'QSqlQuery query' has incomplete type and cannot be defined"
Здравствуйте, дорогие форумчане. Или QT такой капризный и глючный или у меня руки кривые(что-то я наверное не понял). Второе...

QSqlQuery получение значения из выполненного запроса
Доброго времени суток! Есть следующий запрос: QSqlQuery checkQuery; checkQuery.prepare(&quot;SELECT...

Почему QSqlQuery выполняющий SELECT-запрос с WHERE условием возвращает нулевую строку?
Столкнулся с небольшой проблемой, решение которой заняло у меня немного времени, но она сумела немного потрепать мне нервы. Рассматриваю...

21
0 / 0 / 0
Регистрация: 07.04.2020
Сообщений: 22
09.04.2020, 20:23  [ТС]
Студворк — интернет-сервис помощи студентам
Если я удалю базу данных тем же QSqlQuery, я уже не увижу данных. В общем как и раньше данные нужно забирать до удаления. Этот код не работает.

Если я удалю данные другим QSqlQuery, но перед этим встану на последнюю запись,то я смогу увидеть мои данные после удаления.

В целом тут нет большой проблемы, как не потерять данные понятно, просто удивляет, что по сути запрос до конца не выполнился, пока я не прошёл все элементы. Скорее всего, тут в настройках sqlite проблемы и на других БД такого нет.

По поводу VACUUM вопрос, он и для временных таблиц имеет место?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.04.2020, 20:32
Цитата Сообщение от Drewandrew Посмотреть сообщение
Если я удалю базу данных тем же QSqlQuery, я уже не увижу данных. В общем как и раньше данные нужно забирать до удаления.
То есть вам нужны (еще нужны) эти данные, и вы предполагаете сохранить их в запросе? Это неверная мысль. Запрос-это не данные, и даже не оболочка над данными. Это просто объект-курсор, проходящий по данным и извлекающий их (если есть). Если они есть-он их извлечет, если нет-нет. В вашем случае все определяет случайность, данные могут и удалиться, а могут и нет. А вы исходите из предположения, что данные содержатся в самом запросе. Это ошибочное предположение. Извлекайте данные и потом делайте с ними что хотите.
Цитата Сообщение от Drewandrew Посмотреть сообщение
По поводу VACUUM вопрос, он и для временных таблиц имеет место?
Для любых. В доках по SQLite сказано, что связка DELETE и VACUUM является аналогом TRUNCATE TABLE.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2020, 20:32

QSqlQuery::excec() + foreach
Добрый день. Такой вопрос возник: Я хочу организовать заполнение таблицы в цикле. Казалось бы, в чем проблема: открываем Саммерфилда,...

Qsqlquery не работает оператор LIKE
Привет всем! использую psql (PostgreSQL) 9.1.13 ... qt 5.2.1 ... linux mint 16 ... пишу такой запрос...

QSqlQuery value не возвращает результат
сабж в теме, непойму что не так... QSqlQuery Qquery; int IdMoreInfoRow = 0; if(!Qquery.exec(&quot;SELECT count(`rowid`) FROM...

Знаки ? в ответе QSqlQuery
Доброго времени суток! Возникла такая проблема, есть БД MS SQL, база не моя, изменять структуру ни как нельзя. База имеет Collation =...

QSqlQuery Segmentation fault
Доброго времени суток! QList&lt;Record&gt; SqlUtilities::getListOfRecords() { QSqlQuery query(db); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru