uses
DbiProcs;
with Table dobegin
OldState := Active;
Close;
Exclusive := True;
Open;
DbiPackTable(DBHandle, Handle, nil, nil, True);
{^ здесь можно добавить check()}
Close;
Exclusive := False;
Active := OldState;
{ при желании можно сохранить закладку }end;
Автор: Pavel Kulchenko
Пpимеp для Paradox:
uses BDE; // for D3, для D2 не помню (что-то типа DbiProcs и еще что-то)// для пpимеpа
tLog: TTable; // таблица, юзающая d:\db\log.dbvar
TblDesc: CRTblDesc;
rslt: DBIResult;
Dir: string; //имеется в виду huge string т.е. {$H+}
hDb: hDbiDb;
begin
tLog.Active := False; //деактивиpуем TTable
SetLength(Dir, dbiMaxNameLen + 1);
DbiGetDirectory(tLog.DBHandle, False, PChar(Dir));
SetLength(Dir, StrLen(PChar(Dir)));
DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb);
DbiSetDirectory(hDb, PChar(Dir));
FillChar(TblDesc, sizeof(CRTblDesc), 0);
StrPCopy(TblDesc.szTblName, 'd:\db\log.db');
// здесь должно быть полное имя файла//котоpое можно: а) ввести pуками;//б) вытащить из пpопеpтей таблицы;//в) вытащить из алиаса;//г) см. FAQ
StrCopy(TblDesc.szTblType, szParadox);
//BTW тут может и szDBase стоять
TblDesc.bPack := TRUE;
DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False);
DbiCloseDatabase(hDb);
end;
// можно еще чеки ввести, но облом :-)
Код на Delphi для упаковки и переструктуризации таблицы в формате dBase 4
В первой части кода используется модуль DbiProcs, а в процедуре Table выполняются следующие шаги:
Закрытие текущей таблицы.
Открытие таблицы в исключительном режиме (для предотвращения одновременного доступа).
Вызов функции DbiPackTable для упаковки таблицы.
Закрытие таблицы.
Восстановление исходного состояния таблицы (включая ее активный статус).
Комментарий ^ здесь можно добавить check() предполагает, что можно добавить проверку ошибок или специфических условий перед упаковкой таблицы.
В второй части кода используется модуль BDE, а в процедуре tLog выполняются следующие шаги:
Деактивация объекта TTable.
Получение директории файла базы данных с помощью функции DbiGetDirectory.
Открытие нового handles для базы данных с помощью функции DbiOpenDatabase.
Установка текущей директории в полученную в шаге 2.
Создание структуры CRTblDesc и заполнение ее информацией о таблице (имя, тип).
Установка флага упаковки (bPack) в значение TRUE.
Вызов функции DbiDoRestructure для упаковки таблицы.
Закрытие handles для базы данных с помощью функции DbiCloseDatabase.
Комментарий // можно еще чеки ввести, но облом :-) предполагает, что можно добавить дополнительные проверки или код обработки ошибок, но это не необходимо в этом случае.
Альтернативные решения:
Для баз данных dBase:
Вы можете использовать функцию DbiPackTable с дополнительными параметрами для контроля процесса упаковки, например, указанием уровня сжатия или установкой таймаута.
Вместо использования исключительного режима можно использовать общий режим и реализовать механизмы блокировки для предотвращения одновременного доступа.
Для баз данных Paradox:
Вы можете использовать компонент TSession из модуля BDE для управления соединениями с базами данных и транзакциями.
Вместо упаковки таблицы вручную можно использовать компонент TParadoxTable из модуля Paradox для сжатия или переструктуризации данных таблицы.
В статье описано пакование таблиц dBASE и Paradox с помощью библиотек DbiProcs и BDE.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.