Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

Как в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
3-77811
Kati
2003-07-03 16:44
2003.07.24
Событие поля TekSetText


14-78109
Lika
2003-07-08 13:03
2003.07.24
Срочно! Пожалуйста помогите!


1-77943
oduvan
2003-07-10 10:00
2003.07.24
Как показать при помощи Делфи хинт от ХП?


1-77952
cyberwolf
2003-07-11 00:17
2003.07.24
Рекурсивного обход директории


7-78166
Maverick
2003-05-14 09:38
2003.07.24
Печать на плоттер