Форум: "Базы";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизКак в Paradox заставить все изменения сохранить физически... Найти похожие ветки
← →
USAtyj (2003-07-01 11:29) [0]Ситуация такая:
Есть программулина, которая работает с парадоксовскими таблицами. По окончании программы хочу сжимать все таблицы в один файл (zip-архив), чтоб пользователь видел только один файл. При запуске программы таблицы распаковываются и с ними идет работа. НО! Пока приложение не закончит свою работу, физически файлы не изменяются, т.е. я архивирую файлы со старыми данными, а уже потом все данные реально сливаются в файлы.
Все таблицы в DataModule, на уничтожение DataModule делаю FlushBuffers для каждой таблицы. Но это не помогает.
Кто-что может посоветовать.
Заранее спасибо.
← →
Семен Сорокин (2003-07-01 11:35) [1]на уничтожение DataModule делаю FlushBuffers для каждой таблицы а упаковка идет после уничтожения?
делай DataBase.Close
← →
USAtyj (2003-07-01 11:57) [2]Вот код на уничтожении:
for i:=0 to ComponentCount-1 do
if Components[i] is TTable then
begin
(Components[i] as TTable).Open;
(Components[i] as TTable).FlushBuffers;
(Components[i] as TTable).Close;
end;
Компоненты Database у меня нет. У меня просто для каждой таблицы в свойстве DatabaseName прописывается при запуске путь к каталогу, в котором таблицы.
← →
gek (2003-07-01 12:26) [3]
> for i:=0 to ComponentCount-1 do
> if Components[i] is TTable then
> begin
> (Components[i] as TTable).Open;
> dbisavechanges( (Components[i] as TTable).handle);
> (Components[i] as TTable).Close;
> end;
← →
USAtyj (2003-07-01 13:13) [4]FlushBuffers как раз и вызывает dbisavechanges().
Но не помогает все равно.
Но если делать изменения с помощью sql-запросов, тогда обновления сразу в файл записываются.
← →
gek (2003-07-01 13:29) [5]Можно так попробовать, может получится
(Components[i] as TTable).Active:=true;
(Components[i] as TTable).FlushBuffers;
(Components[i] as TTable).Active:=false;
(Components[i] as TTable).DatabaseName:="";
(Components[i] as TTable).TableName:="";
← →
Семен Сорокин (2003-07-01 13:49) [6]и все-же, когда программно вызывается архиватор?
сразу после приведенного блока, или из другого места?
← →
USAtyj (2003-07-01 15:02) [7]FlushBuffers вызывается OnDestroy для DataModule.
А функция, в которой просиходит архивация, вызывается уже после
Application.Run;
← →
VAleksey (2003-07-01 15:07) [8]
> USAtyj (01.07.03 15:02)
Капец.
А ты трассировкой пройдись и посмотри в какой последовательности и что у тебя работает.
← →
gek (2003-07-01 15:08) [9]Семен Сорокин © (01.07.03 13:49)
не зря-то спрашивал.
А функция, в которой просиходит архивация, вызывается уже после
Application.Run;
Вот и вызови ее после FlushBuffers
т.е. после цикла
← →
Семен Сорокин (2003-07-01 15:10) [10]USAtyj (01.07.03 15:02)
дело в том что, скорее всего, твой DataModule удаляется позже того как у тебя происходит архивация данных, поэтому в архив попадают "файлы со старыми данными"
← →
VAleksey (2003-07-01 15:12) [11]1) Вообще dbiSaveChanges - принудительно сбрасывает буфер на диск.
2) Установка Local Share в BDE Administrator заставит BDE сбрасывать кэш после любых изменений.
3) У тебя Delphi в этот момент запущено?
← →
USAtyj (2003-07-01 15:22) [12]2 Семен Сорокин:
вы были правы, мне почему-то казалось "по умолчанию", что датамодуль уничтожается раньше, чем пакую, поскольку пакую ужо савсем в конце, а трассировкой лишний раз поленился. Щас протрассировал - пакует раньше.
Это называется тупостью от лени.
Всем спасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c