Russian Qt Forum
Июнь 11, 2024, 01:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: close() не освобождает файл  (Прочитано 12111 раз)
Flakes
Гость
« Ответ #15 : Сентябрь 09, 2008, 00:28 »

Весь код выкладывать - заиметься можно.
Конечно же я много где query юзаю; и tableModel тоже - он объявлен членом класса. Все в пределах методов, за их скопами этого не должно быть видно, пытаюсь удалить базу через другой метод - и там базы не должно быть видно.

Или я не совсем понимаю суть активности. А как отпускается запрос, метод select() считается? Нигде в глобальной области видимости у меня query не висят.
Записан
ритт
Гость
« Ответ #16 : Сентябрь 09, 2008, 01:36 »

наследники QSqlQueryModel используют QSqlQuery для чтения данных и этот QSqlQuery активен, пока несдохнет сервер/соединение или сама модель. чтобы прибить этот квери можно установить пустой/невалидный запрос в модель или пнуть этому квери finish() - модель, естественно, очистится и при возобновлении соединения запрос придётся переустанавливать. можно написать свою SqlQueryModel, которая не будет гонять запрос, а сразу по исполнении сольёт все данные во внутренний кэш - но для объёмных результатов ресурсозатраты модели весьма значительно увеличатся

на данный момент в кутэ не существует красивого способа (при|)остановить работу объектов, использующих соединение QSqlDriver (на самом деле QSqlDatabase - всего лишь удобная обёртка для QSqlDriver) - эти объекты придётся деактивировать или убивать
Записан
Flakes
Гость
« Ответ #17 : Декабрь 20, 2009, 06:07 »

Проблема снова всплыла. Если ставлю перед удалением базы query.exec("VACUUM"), то файл не отпускается.

Код
C++ (Qt)
QString connectionName;
{
QSqlDatabase db = QSqlDatabase::database();
if (!db.isValid())
return;
 
QSqlQuery query;
query.exec("VACUUM");
 
connectionName = db.connectionName();
if(db.isOpen())
db.close();
}
QSqlDatabase::removeDatabase(connectionName);
 

Без вакуума все норм.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #18 : Декабрь 20, 2009, 13:50 »

а после этого вакума, не надо подтверждать транзакцию?
Записан

Юра.
Flakes
Гость
« Ответ #19 : Декабрь 20, 2009, 20:26 »

Не знаю как нужно ее подтвержать. Сделал так, но видимо не правильно:

Код
C++ (Qt)
db.transaction();
QSqlQuery query;
query.exec("VACUUM");
db.commit();
 
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.13 секунд. Запросов: 19.