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

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



Память: 0.47 MB
Время: 0.014 c
14-71317
Слесарь нематерящийся
2002-07-26 07:49
2002.08.22
Прога


6-71280
newbie1
2002-06-11 14:35
2002.08.22
немогу получить сообщение от сервера


14-71381
Oleg_Gashev
2002-07-28 20:38
2002.08.22
Nullsoft Install


3-71046
RUS1
2002-08-01 14:35
2002.08.22
Подскажите утилитку для администрации IB 6 (типа quickDesk)


1-71209
inc(665)
2002-08-09 12:49
2002.08.22
вопрос по RxRichEdit




   Наверх