Russian Qt Forum

Qt => Базы данных => Тема начата: 17dufa от Январь 14, 2008, 13:12



Название: Удаление из *.db файла
Отправлено: 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 блокнотом, то эти записи там ЕСТЬ. В результате, если записи по добавляются в базу, то удаляются файл растет и конца и края этому не видно. Подскажите, может при переходе какого-то барьера в размере файла эти записи все-таки будут удалены? или надо как-то по особенному удалять?


Название: Re: Удаление из *.db файла
Отправлено: sikuda от Январь 14, 2008, 13:51
Есть такая особенность SQLite 3. Как и *.DBF он не удаляет полностью и не уменьшает конечный файл. Использую VACUUM при выходе из программы.


Название: Re: Удаление из *.db файла
Отправлено: 17dufa от Январь 14, 2008, 13:55
а можно кусок кода про этот VACUUM?


Название: Re: Удаление из *.db файла
Отправлено: Sergeich от Январь 14, 2008, 21:24
:lol:
QSqlQuery q(db);
q.exec("VACUUM");


Название: Re: Удаление из *.db файла
Отправлено: 17dufa от Январь 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");


Название: Re: Удаление из *.db файла
Отправлено: ритт от Январь 21, 2008, 16:23
гениально! :)
приятно, когда люди умеют читать документацию и, более того, читают документацию...


Название: Re: Удаление из *.db файла
Отправлено: 17dufa от Январь 21, 2008, 17:19
когда уж совсем ничего не получается - читайте документацию
хотелось сэкономить времени, каюсь.