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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление из *.db файла  (Прочитано 5489 раз)
17dufa
Гость
« : Январь 14, 2008, 13:12 »

Здраствуйте,
по поиску ничего похожего не нашел.
Итак: qt 4.2.2 windows, комерц, sqlite, входящий в qt, база данных в виде *.db файла. Проблема при удалении записи, которое выглядит примерно так:
Код:
db=QSqlDatabase::addDatabase("QSQLITE");
db.transaction();
QSqlQuery q(db);
q.exec("delete from agentsinfo where id=12");
db.commit();
q.exec возвращает true. И действительно, при последующем чтении из базы удаленных записей нет, но вот парадокс: если открыть файл *.db блокнотом, то эти записи там ЕСТЬ. В результате, если записи по добавляются в базу, то удаляются файл растет и конца и края этому не видно. Подскажите, может при переходе какого-то барьера в размере файла эти записи все-таки будут удалены? или надо как-то по особенному удалять?
Записан
sikuda
Гость
« Ответ #1 : Январь 14, 2008, 13:51 »

Есть такая особенность SQLite 3. Как и *.DBF он не удаляет полностью и не уменьшает конечный файл. Использую VACUUM при выходе из программы.
Записан
17dufa
Гость
« Ответ #2 : Январь 14, 2008, 13:55 »

а можно кусок кода про этот VACUUM?
Записан
Sergeich
Гость
« Ответ #3 : Январь 14, 2008, 21:24 »

:lol:
QSqlQuery q(db);
q.exec("VACUUM");
Записан
17dufa
Гость
« Ответ #4 : Январь 21, 2008, 15:02 »

а в какой последовательности это надо делать? делаю так:
Код:
db.transaction();
QSqlQuery q1(db);
q1.exec("delete from agentsinfo");
q1.exec("VACUUM");
db.commit();
q1.exec("VACUUM"); возвращает false.

вот выдержка из документации, по sqlite
"VACUUM only works on the main database. It is not possible to VACUUM an attached database file."
как это понимать? я боюсь у меня именно второй случай
изменения типа:
Код:
q1.exec("VACUUM FULL"); 
q1.exec("VACUUM agentsinfo");
тоже ничего не дают

оказывается надо было читать документацию дальше:
"The VACUUM command will fail if there is an active transaction. The VACUUM command is a no-op for in-memory databases."
вот код, который работает:
Код:
db.transaction();
QSqlQuery q1(db);
q1.exec("delete from agentsinfo");
db.commit();
q1.exec("VACUUM agentsinfo");
« Последнее редактирование: Январь 21, 2008, 15:20 от 17dufa » Записан
ритт
Гость
« Ответ #5 : Январь 21, 2008, 16:23 »

гениально! Улыбающийся
приятно, когда люди умеют читать документацию и, более того, читают документацию...
Записан
17dufa
Гость
« Ответ #6 : Январь 21, 2008, 17:19 »

когда уж совсем ничего не получается - читайте документацию
хотелось сэкономить времени, каюсь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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