| Название: 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 Не знаю как нужно ее подтвержать. Сделал так, но видимо не правильно: Код 
 |