Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.012 c
6-78031
Chris
2003-05-16 20:02
2003.07.24
Как узнать маршрут между хостами в локальной сети?


7-78174
Arkara
2003-05-13 14:19
2003.07.24
Запуск приложения от имени другого юзера


1-77983
Vasilii
2003-07-11 13:22
2003.07.24
двойная кнопка


3-77754
Olivka
2003-06-29 16:11
2003.07.24
Использование макросов в FIBPlus


3-77721
Ildar
2003-06-30 16:06
2003.07.24
Выборка из двух ODBC баз.




   Наверх