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

Вниз

Удаление большого числа записей из БД   Найти похожие ветки 

 
АСУ-Антон   (2002-08-01 11:27) [0]

Мастера, помогите!!!
Срочно нужно научиться программно (пусть по нажатию кнопки) собирать мусор и удалять его (не используя InterBase Server Manager) после удаления большого числа записей из БД PARADOX, отобранных по определённому признаку. (После удаления методом Table1.DELETE (SQL использовать нельзя) размер базы не уменьшается).


 
Val ©   (2002-08-01 11:46) [1]

нужно паковать таблицы, вопрос довольно частый, должен быть в факе или поиск по форуму.


 
Mike_Goblin ©   (2002-08-02 09:50) [2]

Присоединяюсь к предыдущему автору по поводу упаковки
PS а какое отношение имеет InterBase Server Manager к Paradox?


 
Асу-Антон   (2002-08-02 10:44) [3]

В книге по программированию БД и справке Delphi5 я искал ответ.
Насколько я понял, InterBase SM предназначен, в частности, для удаления мусора.
(у него ещё много функций).
Мне посоветовали использовать функцию PackTable из пакета RxLib.


 
Val ©   (2002-08-02 10:50) [4]

Насколько я понял, InterBase SM предназначен...
ну..допустим :) но вы-то работаете с парадоксом? эдак можно и оракловских и MSSQL-ских утилит нахватать и ими тесто месить? ;)


 
Асу-Антон   (2002-08-02 10:55) [5]

Понял:). Просто раньше дела с этим не имел.

procedure PackTable(Table: TTable);var Props: CURProps; hDb:
hDBIDb;
TableDesc: CRTblDesc;begin if not Table.Active then
raise EDatabaseError.Create("Table must be opened to pack");
if not Table.Exclusive then
raise EDatabaseError.Create("Table must be opened exclusively to
pack");
Check(DbiGetCursorProps(Table.Handle, Props));
if Props.szTableType = szPARADOX then begin
FillChar(TableDesc, sizeof(TableDesc), 0);
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE,
hDBIObj(hDb)));
StrPCopy(TableDesc.szTblName, Table.TableName);
StrPCopy(TableDesc.szTblType, Props.szTableType);
TableDesc.bPack := True; Table.Close;
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil,
False)); end
else if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE,
True))
else
raise EDatabaseError.Create("Table must be either of Paradox or
dBASE " +
"type to pack"); Table.Open;end;


 
Асу-Антон   (2002-08-02 12:56) [6]

Добавление:
1) Не забыть включить в uses ....,dbiProcs;

Вопрос:
Крапиляция проходит, но при попытке очистки выдаёт предусмотренное сообщение:
"Table must be opened exclusively to
pack");
Как это исправить?


 
Val ©   (2002-08-02 13:00) [7]

Крапиляция - это ж надо так :))
Это не исправлять надо, а следовать сказанному - таблица для упаковки должна бвть открыта в эксклюзивном режиме: .Exclusive := True; После упаковки можно вернуть ее в прежнее состояние.


 
Асу-Антон   (2002-08-02 15:36) [8]

Все заработало
Всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2002.08.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
6-71278
Новеньки в Делфи
2002-06-11 02:02
2002.08.22
свой сервер, помогите теорией


3-70950
Shaman
2002-07-29 23:18
2002.08.22
Компонента для визуального построения выражения для фильтра


1-71080
VDen
2002-08-12 12:05
2002.08.22
Выход из условия в case


1-71143
Лана Розанова
2002-08-13 08:21
2002.08.22
Клавиатура


1-71155
Spooky
2002-08-13 14:28
2002.08.22
Регистр символа