СообЧа > База Знаний > Программирование > Delphi

Вопрос

На Delphi написана программа, использует несколько связанных таблиц Paradox. Периодически (предположительно после зависаний, некорректных перезагрузок и пр.) в базе наблюдается бардак — потери данных, несоответствие… Упаковка таблиц при помощи DataBaseDesktop помогает. Как программно паковать таблицы Paradox или восстанавливать индексы?

Ответ

Вот держи пример, я сам использую в работе:
unit repair_u;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, BDE, StdCtrls;
type
TForm1 = class(TForm)
tb: TTable;
te: TTable;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
// Pack a Paradox or dBASE table
// The table must be opened execlusively before calling this function…
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// Make sure the table is open exclusively so we can get the db handle…
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');
// Get the table properties to determine table type…
Check(DbiGetCursorProps(Table.Handle, Props));
// If the table is a Paradox table, you must call DbiDoRestructure…
if (Props.szTableType = szPARADOX) then begin
// Blank out the structure…
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table's cursor handle…
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor…
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor…
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE…
TableDesc.bPack := True;
// Close the table so the restructure can complete…
Table.Close;
// Call DbiDoRestructure…
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
end
else
// If the table is a dBASE table, simply call DbiPackTable…
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
// Pack only works on PAradox or dBASE; nothing else…
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' +
'type to pack');
Table.Open;
end;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
tb.open; PackTable(tb); tb.close;
te.open; PackTable(te); te.close;
end;
end


Сергей А.



Copyright © 2000-2004 Сообщество Чайников
Контактная информация