Russian Qt Forum
Сентябрь 30, 2024, 14:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

Юзаю SQLite:

Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(databaseFileName);
db.open();
...
db.close();

db.isOpen() дает false, но файл с базой тем не менее еще занят, пока приложение не закрыть.
Записан
ритт
Гость
« Ответ #1 : Сентябрь 05, 2008, 17:37 »

датабазу удали
Записан
Flakes
Гость
« Ответ #2 : Сентябрь 05, 2008, 18:04 »

сделал QSqlDatabase::removeDatabase("QSQLITE"); - не катит, файл все равно занят..
Записан
ритт
Гость
« Ответ #3 : Сентябрь 05, 2008, 18:16 »

а почему не QSqlDatabase::removeDatabase("ой-ой-ой") ?
ртфм по removeDatabase
Записан
Flakes
Гость
« Ответ #4 : Сентябрь 05, 2008, 18:52 »

там мануал по ней из двух срок Веселый

попробывал QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName()) - не выходит
Записан
ритт
Гость
« Ответ #5 : Сентябрь 05, 2008, 20:11 »

не верю Улыбающийся
прикрепляй компилябельный пример
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Сентябрь 06, 2008, 07:10 »

2 Flakes, удаляется, читая приведенный тобою мануал, так:
QSqlDatabase::removeDatabase();
драйвер не указывается, имя соединения в твоем случае не нужно, оно умалчиваемое.
Записан

Юра.
Flakes
Гость
« Ответ #7 : Сентябрь 07, 2008, 22:50 »

Берем любой экзампл из \examples\sql\. В конец connection.h дописываем удаление ДБ, и заменяем :memory: на имя файла. И получаем мою траблу - файл не отпускается. Может у меня бага в моем Qt 4.4.

2 Flakes, удаляется, читая приведенный тобою мануал, так:
QSqlDatabase::removeDatabase();
драйвер не указывается, имя соединения в твоем случае не нужно, оно умалчиваемое.

Указывается имя соединения, которое я и получаю по connectionName(). Ты предлагаешь совсем без параметра - так это не прокатит.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Сентябрь 08, 2008, 01:47 »

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

Юра.
ритт
Гость
« Ответ #9 : Сентябрь 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();
if(db.isValid())
{
if(db.isOpen())
db.close();
QString connectionName = db.connectionName();
db = QSqlDatabase();
QSqlDatabase::removeDatabase(connectionName);
}

файл базы освобождается
будем дальше спорить о глюках?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Сентябрь 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
даже неподумал что этот момент человек пропустил, а самому лень было проверять.
Записан

Юра.
ритт
Гость
« Ответ #11 : Сентябрь 08, 2008, 08:17 »

а я об этом говорил ещё в первом и твором ответе...и надеялся что флэйкс пойдёт читать доки и сам поймёт свою ошибку

ветку оставляем для таких же ленивых? Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Сентябрь 08, 2008, 09:40 »

Цитировать
ветку оставляем для таких же ленивых?
обязательно, я сам на эти грабли наступал, и еще не раз люди на них наступят.
Записан

Юра.
Flakes
Гость
« Ответ #13 : Сентябрь 08, 2008, 17:58 »

Всем спасибо!

На экзампле заработало, а в моем проекте - нет, делаю абсолютно тоже самое. Ну да ладно, думаю уже смогу разобраться.
Записан
ритт
Гость
« Ответ #14 : Сентябрь 08, 2008, 19:40 »

> На экзампле заработало
...поэтому и спрашивал твой код, а не стандартный пример

значит, в своём проекте где-то не отпускаешь запрос или базу (возможно, создаёшь с куче и объект не удаляешь: используешь (квери|тэйбл)модель - там запрос всегда активен; или используешь глобальные объекты) - в любом случае, в скопе, где ты закрываешь соединение и удаляешь базу, эта же самая база уже не должна быть активной...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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