Запись буфера BDE на диск

Сделанные в таблице изменения непосредственно на диск не записываются до тех пор, пока таблица не закрыта. Потеря питания или сбой в системе могут привести к утрате данных и прочим неприятностям. Чтобы избежать этого, существует два прямых вызова Database Engine, приводящих к одному и тому же результату. Эти функции – DbiUseIdleTime и DbiSaveChanges.

Последняя сохраняет на диске все обновления, находящиеся в буфере таблицы, связанной с курсором (hDBICur). Функция может быть вызвана из любого места программы. Например, можно при каждом обновлении записи сохранять на диске все изменения (добавьте BDE в список используемых модулей):

procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
  DbiSaveChanges(Table1.Handle);
end;
При таком способе можно не опасаться порчи данных в случае потери питания или сбоя системы, которая может произойти после обновления записи.

При помощи функции DBISaveChanges также можно сделать постоянной временную таблицу (созданную с помощью DBICreateTempTable).

Эта функция не применима к таблицам SQL.

DBIUseIdleTime может быть вызвана, если очередь запросов Windows (Windows Message Queue) пуста. Это позволяет Database Engine сохранить на диске «грязные буферы». Другими словами, выполняется операция DBISaveChanges, но применительно ко ВСЕМ измененным таблицам. Тем не менее, данная операция не обязательно должна выполняться после каждого обновления записи, ее нужно приберечь для «холостого» периода (период простоя, idle).

В Delphi этому можно найти такое применение (добавьте BDE в список используемых модулей):

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := UseIdle;
end;

procedure Tform1.UseIdle(Sender: TObject; var Done: Boolean);
begin
  DbiUseIdleTime;
end;
Замечания
Использование обоих вызовов DBIUseIdleTime и DBISaveChanges (после каждого обновления записи) излишне и сопровождается необязательными вызовами функций. Если приложение выполняет множественный ввод новых записей или их редактирование в течение небольшого периода времени, рекомендуем осуществлять вызов функции DBIUseIdleTime во время простоя клиента, а вызов DBISaveChanges по завершении «пакета» обновлений.

В случае если в таблице выполняется не слишком много изменений, клиент может использовать вызов DBISaveChanges после каждого постинга (обновления записи) или же «прикрепить» к таймеру вызов DBIUseIdleTime.