Название: close() не освобождает файл Отправлено: Flakes от Сентябрь 05, 2008, 15:17 Юзаю SQLite:
Код: QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.isOpen() дает false, но файл с базой тем не менее еще занят, пока приложение не закрыть. Название: Re: close() не освобождает файл Отправлено: ритт от Сентябрь 05, 2008, 17:37 датабазу удали
Название: Re: close() не освобождает файл Отправлено: Flakes от Сентябрь 05, 2008, 18:04 сделал QSqlDatabase::removeDatabase("QSQLITE"); - не катит, файл все равно занят..
Название: Re: close() не освобождает файл Отправлено: ритт от Сентябрь 05, 2008, 18:16 а почему не QSqlDatabase::removeDatabase("ой-ой-ой") ?
ртфм по removeDatabase Название: Re: close() не освобождает файл Отправлено: Flakes от Сентябрь 05, 2008, 18:52 там мануал (http://doc.trolltech.com/4.4/qsqldatabase.html#removeDatabase) по ней из двух срок :D
попробывал QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName()) - не выходит Название: Re: close() не освобождает файл Отправлено: ритт от Сентябрь 05, 2008, 20:11 не верю :)
прикрепляй компилябельный пример Название: Re: close() не освобождает файл Отправлено: lit-uriy от Сентябрь 06, 2008, 07:10 2 Flakes, удаляется, читая приведенный тобою мануал, так:
QSqlDatabase::removeDatabase(); драйвер не указывается, имя соединения в твоем случае не нужно, оно умалчиваемое. Название: Re: close() не освобождает файл Отправлено: Flakes от Сентябрь 07, 2008, 22:50 Берем любой экзампл из \examples\sql\. В конец connection.h дописываем удаление ДБ, и заменяем :memory: на имя файла. И получаем мою траблу - файл не отпускается. Может у меня бага в моем Qt 4.4.
2 Flakes, удаляется, читая приведенный тобою мануал, так: QSqlDatabase::removeDatabase(); драйвер не указывается, имя соединения в твоем случае не нужно, оно умалчиваемое. Указывается имя соединения, которое я и получаю по connectionName(). Ты предлагаешь совсем без параметра - так это не прокатит. Название: Re: close() не освобождает файл Отправлено: lit-uriy от Сентябрь 08, 2008, 01:47 думал можно не указывать т.к. соединение у тебя по-умолчанию.
хм, посмотрел доку, и правда не катит, отсюда мысль - а соединение по-умолчанию может нельзя удалять? попробуй задать своему соединению имя, и его потом удалять. Название: Re: close() не освобождает файл Отправлено: ритт от Сентябрь 08, 2008, 07:29 Берем любой экзампл из \examples\sql\. В конец connection.h дописываем удаление ДБ, и заменяем :memory: на имя файла. И получаем мою траблу - файл не отпускается. Может у меня бага в моем Qt 4.4. ещё раз напоминаю о необходимости читать документацию! в connectino.h заменяю db.setDatabaseName(":memory:") на db.setDatabaseName("memory.db") окружаю весь код createConnection() вплоть до return true фигурными скобками {} - понижаю скоп кода после новодобаленной } и перед return true доавляю код Код: QSqlDatabase db = QSqlDatabase::database(); файл базы освобождается будем дальше спорить о глюках? Название: Re: close() не освобождает файл Отправлено: lit-uriy от Сентябрь 08, 2008, 07:40 ну да, так и написано:
Цитировать { даже неподумал что этот момент человек пропустил, а самому лень было проверять.QSqlDatabase db = QSqlDatabase::database("sales"); QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db); } // Both "db" and "query" are destroyed because they are out of scope QSqlDatabase::removeDatabase("sales"); // correct Название: Re: close() не освобождает файл Отправлено: ритт от Сентябрь 08, 2008, 08:17 а я об этом говорил ещё в первом и твором ответе...и надеялся что флэйкс пойдёт читать доки и сам поймёт свою ошибку
ветку оставляем для таких же ленивых? :) Название: Re: close() не освобождает файл Отправлено: lit-uriy от Сентябрь 08, 2008, 09:40 Цитировать ветку оставляем для таких же ленивых? обязательно, я сам на эти грабли наступал, и еще не раз люди на них наступят.Название: Re: close() не освобождает файл Отправлено: Flakes от Сентябрь 08, 2008, 17:58 Всем спасибо!
На экзампле заработало, а в моем проекте - нет, делаю абсолютно тоже самое. Ну да ладно, думаю уже смогу разобраться. Название: Re: close() не освобождает файл Отправлено: ритт от Сентябрь 08, 2008, 19:40 > На экзампле заработало
...поэтому и спрашивал твой код, а не стандартный пример значит, в своём проекте где-то не отпускаешь запрос или базу (возможно, создаёшь с куче и объект не удаляешь: используешь (квери|тэйбл)модель - там запрос всегда активен; или используешь глобальные объекты) - в любом случае, в скопе, где ты закрываешь соединение и удаляешь базу, эта же самая база уже не должна быть активной... Название: Re: close() не освобождает файл Отправлено: Flakes от Сентябрь 09, 2008, 00:28 Весь код выкладывать - заиметься можно.
Конечно же я много где query юзаю; и tableModel тоже - он объявлен членом класса. Все в пределах методов, за их скопами этого не должно быть видно, пытаюсь удалить базу через другой метод - и там базы не должно быть видно. Или я не совсем понимаю суть активности. А как отпускается запрос, метод select() считается? Нигде в глобальной области видимости у меня query не висят. Название: Re: close() не освобождает файл Отправлено: ритт от Сентябрь 09, 2008, 01:36 наследники QSqlQueryModel используют QSqlQuery для чтения данных и этот QSqlQuery активен, пока несдохнет сервер/соединение или сама модель. чтобы прибить этот квери можно установить пустой/невалидный запрос в модель или пнуть этому квери finish() - модель, естественно, очистится и при возобновлении соединения запрос придётся переустанавливать. можно написать свою SqlQueryModel, которая не будет гонять запрос, а сразу по исполнении сольёт все данные во внутренний кэш - но для объёмных результатов ресурсозатраты модели весьма значительно увеличатся
на данный момент в кутэ не существует красивого способа (при|)остановить работу объектов, использующих соединение QSqlDriver (на самом деле QSqlDatabase - всего лишь удобная обёртка для QSqlDriver) - эти объекты придётся деактивировать или убивать Название: Re: close() не освобождает файл Отправлено: Flakes от Декабрь 20, 2009, 06:07 Проблема снова всплыла. Если ставлю перед удалением базы query.exec("VACUUM"), то файл не отпускается.
Код
Без вакуума все норм. Название: Re: close() не освобождает файл Отправлено: lit-uriy от Декабрь 20, 2009, 13:50 а после этого вакума, не надо подтверждать транзакцию?
Название: Re: close() не освобождает файл Отправлено: Flakes от Декабрь 20, 2009, 20:26 Не знаю как нужно ее подтвержать. Сделал так, но видимо не правильно:
Код
|