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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: SQLite удаление БД [РЕШЕНО]  (Прочитано 19987 раз)
deMax
Гость
« : Июнь 29, 2010, 15:48 »

Доброго времени суток, не могу удалить файл с базой данных, т.к. он блокируется программой несмотря на закрытие БД. Файл удаляю чтобы очистить БД. ос windows, qt creator 1.3.1.
« Последнее редактирование: Июль 06, 2010, 12:24 от deMax » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #1 : Июнь 29, 2010, 15:49 »

как закрываешь БД ?

попробуй так

Код:
QSqlDatabase::removeDatabase(QSqlDatabase::connectionName());
QSqlDatabase::close();
« Последнее редактирование: Июнь 29, 2010, 15:57 от ecspertiza » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #2 : Июнь 29, 2010, 19:47 »

Почитайте внимательно документацию сервера БД - в IB/FB например вообще нельзя делать никакие файловые операции над файлом БД пока сервер запущен! То есть потребуется его остановить не то что для удаления БД но и для корректного копирования - иначе может повредиться и исходная БД и копия будет битой. Но это от сервера зависит...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июнь 29, 2010, 21:27 »

>>в IB/FB например вообще нельзя делать никакие файловые операции над файлом БД пока сервер запущен
если быть более точным, пока есть множество соединений. При монопольном доступе можно хоть что делать.

Но тут речь о SQLite
Записан

Юра.
deMax
Гость
« Ответ #4 : Июнь 30, 2010, 08:19 »

как закрываешь БД ?

попробуй так

Код:
QSqlDatabase::removeDatabase(QSqlDatabase::connectionName());
QSqlDatabase::close();

закрываю вначале close, потом removeDatabase - если поставить remove перед close то он ругнется, что соединение открыто.
После этого пытаюсь удалить файл, тотал командер тоже файл не удаляет если поставить breakpoint после сих операций.
ps. а под linux все великолепно работает, а нужно именно под виндуз  Грустный
Записан
asvil
Гость
« Ответ #5 : Июнь 30, 2010, 09:07 »

Сами тролли вот так делают в примерах:
Код:
 {
     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

Поэтому предалагаю, сам не успел протестировать:
Код:
QSqlDatabase::close();
QSqlDatabase::~QSqlDatabase();
QSqlDatabase::removeDatabase();
Записан
Sahab
Гость
« Ответ #6 : Июнь 30, 2010, 09:15 »

Код:
QSqlDatabase::close();
QSqlDatabase::~QSqlDatabase();
QSqlDatabase::removeDatabase();
 Шокированный
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #7 : Июнь 30, 2010, 13:22 »

Цитировать
Поэтому предалагаю, сам не успел протестировать:
Код:
Код:
QSqlDatabase::close();
QSqlDatabase::~QSqlDatabase();
QSqlDatabase::removeDatabase();

А почему просто не делать так как предлагают тролли и не только в примерах но и в документации? Принудительный вызов деструктора класса который еще в области видимости - это круть... если он объявлен на стеке то деструктор вызовется и второй раз! А QSqlDatabase это value-based класс (как они его сами называют) - то есть его надо именно на стеке объявлять в каждой функции где потребуется работать с БД и не устроит соединение по умолчанию - все это сделано для удобства, чтобь не протягивать через многочисленные функции указатель на QSqlDatabase. QSqlDatabase по определению - все экземпляры в разных функциях созданные к одному подключению меняют настройки только этого одного подключения - то есть сам по себе QSqlDatabase не БД а только класс управляющий подключением!!! С этим многие путаются в начале работы...
Записан
deMax
Гость
« Ответ #8 : Июнь 30, 2010, 15:54 »

Цитировать
Поэтому предалагаю, сам не успел протестировать:
Код:
Код:
QSqlDatabase::close();
QSqlDatabase::~QSqlDatabase();
QSqlDatabase::removeDatabase();
Кто нибудь проверил? У меня файл под виндой нельзя удалить, хотя все эти команды у меня делаются. (Программа уже написана)
Записан
asvil
Гость
« Ответ #9 : Июнь 30, 2010, 20:40 »

Под линуксом файлы можно удалять и с открытыми дескрипторами, поэтому видимо и под линуксом и виндовсом файл остается открытым, пока приложение работает.
Заглядываем в исходники Qt. Без изучения исходников Qt, на мой взгляд, приложение написать невозможно.
Итак видим:
Код:
void QSQLite2Driver::close()
{
    if (isOpen()) {
        sqlite_close(d->access);
        d->access = 0;
        setOpen(false);
        setOpenError(false);
    }
}
Ищем поисковым средством sqlite_close delete file. Находим:
http://osdir.com/ml/db.sqlite.general/2004-02/msg00257.html
Дословно: "хотите удалить? используйте :memory:"

Записан
deMax
Гость
« Ответ #10 : Июль 02, 2010, 10:02 »

Ищем поисковым средством sqlite_close delete file. Находим:
http://osdir.com/ml/db.sqlite.general/2004-02/msg00257.html
Дословно: "хотите удалить? используйте :memory:"

Не совсем то что нужно, все данные которые пишутся в базу обязательно сохраняются. Очистка базы должна происходить при нажатии на кнопку а не при выходе из программы.
« Последнее редактирование: Июль 02, 2010, 10:30 от deMax » Записан
Sahab
Гость
« Ответ #11 : Июль 02, 2010, 13:30 »

Код:
#include <QtCore/QCoreApplication>
#include <QSqlDatabase>
#include <QtDebug>
#include <QFile>
#include <QStringList>

void init() {
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("custom.db");
Q_ASSERT_X(db.open(), "init()","Can't open db");
qDebug() << "[init]\tSUCCES";
qDebug() << "[init]\t" << db.tables();
}

void close() {
QSqlDatabase db = QSqlDatabase::database();
db.close();
qDebug() << "[close]\tclose Invoked";
}

void remove_db() {
if(QFile::remove("custom.db"))
qDebug() << "[remove_db]\tSUCCES";
else
qDebug() << "[remove_db]\tFAILURE";
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
init();
remove_db();
close();
remove_db();
return a.exec();
}

все нормально работает...
Записан
asvil
Гость
« Ответ #12 : Июль 02, 2010, 17:25 »

Не совсем то что нужно, все данные которые пишутся в базу обязательно сохраняются. Очистка базы должна происходить при нажатии на кнопку а не при выходе из программы.
Тогда:
Код:
QSqlQuery query(database);
foreach (QString table, QSqlDatabase::tables())
  query.exec(QString("TRUNCATE TABLE %1").arg(table));

foreach (QString table, QSqlDatabase::tables())
  query.exec(QString("DROP TABLE %1").arg(table));
Записан
niXman
Гость
« Ответ #13 : Июль 02, 2010, 17:25 »

Цитировать
Под линуксом файлы можно удалять и с открытыми дескрипторами
пруфлинк пожалуйста.

Цитировать
Заглядываем в исходники Qt. Без изучения исходников Qt, на мой взгляд, приложение написать невозможно.
странно... "БД только для динамической памяти." ох негодные тролли, такую "каку" написали Смеющийся

и вообще, нафига удалять файл БД?!
Записан
asvil
Гость
« Ответ #14 : Июль 02, 2010, 20:01 »

пруфлинк пожалуйста.
Открываю видео файл в totem'е, удаляю его, totem проигрывает файл до конца. А я наверно неправильно выразился, файл помечается как удаляемый, а удаляется при закрытии последнего дескриптора, так?
и вообще, нафига удалять файл БД?!
deMax очистку решил произвести данным способом.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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