![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в Paradox заставить все изменения сохранить физически... [D5, Paradox]
USAtyj © (2003-07-01 11:29:00)Ситуация такая:
Есть программулина, которая работает с парадоксовскими таблицами. По окончании программы хочу сжимать все таблицы в один файл (zip-архив), чтоб пользователь видел только один файл. При запуске программы таблицы распаковываются и с ними идет работа. НО! Пока приложение не закончит свою работу, физически файлы не изменяются, т.е. я архивирую файлы со старыми данными, а уже потом все данные реально сливаются в файлы.
Все таблицы в DataModule, на уничтожение DataModule делаю FlushBuffers для каждой таблицы. Но это не помогает.
Кто-что может посоветовать.
Заранее спасибо.
USAtyj (2003-07-01 15:22:00) [1]2 Семен Сорокин:
вы были правы, мне почему-то казалось "по умолчанию", что датамодуль уничтожается раньше, чем пакую, поскольку пакую ужо савсем в конце, а трассировкой лишний раз поленился. Щас протрассировал - пакует раньше.
Это называется тупостью от лени.
Всем спасибо.
VAleksey (2003-07-01 15:12:00) [2]1) Вообще dbiSaveChanges - принудительно сбрасывает буфер на диск.
2) Установка Local Share в BDE Administrator заставит BDE сбрасывать кэш после любых изменений.
3) У тебя Delphi в этот момент запущено?
Семен Сорокин (2003-07-01 15:10:00) [3]USAtyj (01.07.03 15:02)
дело в том что, скорее всего, твой DataModule удаляется позже того как у тебя происходит архивация данных, поэтому в архив попадают "файлы со старыми данными"
gek (2003-07-01 15:08:00) [4]Семен Сорокин © (01.07.03 13:49)
не зря-то спрашивал.
А функция, в которой просиходит архивация, вызывается уже после
Application.Run;
Вот и вызови ее после FlushBuffers
т.е. после цикла
VAleksey (2003-07-01 15:07:00) [5]
> USAtyj (01.07.03 15:02)
Капец.
А ты трассировкой пройдись и посмотри в какой последовательности и что у тебя работает.
USAtyj (2003-07-01 15:02:00) [6]FlushBuffers вызывается OnDestroy для DataModule.
А функция, в которой просиходит архивация, вызывается уже после
Application.Run;
Семен Сорокин (2003-07-01 13:49:00) [7]и все-же, когда программно вызывается архиватор?
сразу после приведенного блока, или из другого места?
gek (2003-07-01 13:29:00) [8]Можно так попробовать, может получится
(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:="";
USAtyj (2003-07-01 13:13:00) [9]FlushBuffers как раз и вызывает dbisavechanges().
Но не помогает все равно.
Но если делать изменения с помощью sql-запросов, тогда обновления сразу в файл записываются.
gek (2003-07-01 12:26:00) [10]
> 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 11:57:00) [11]Вот код на уничтожении:
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 прописывается при запуске путь к каталогу, в котором таблицы.
Семен Сорокин (2003-07-01 11:35:00) [12]на уничтожение DataModule делаю FlushBuffers для каждой таблицыа упаковка идет после уничтожения?
делай DataBase.Close