Автор: admin | 14.12.2007 в 2:14 | Рубрики: Базы данных

Как мне открыть таблицу dBASE без требуемого MDX-файла? Я постоянно получаю исключение “Index not found…” (индекс не найден).

Во время создания таблицы dBASE с production-индексом (MDX) в заголовке DBF-файла устанавливается специальный байт. При последующем открытии таблицы, dBASE-драйвер читает этот специальный байт и, если он установлен, он также пытается открыть файл MDX. Если попытка открыть файл MDX заканчивается неудачей, возникает исключительная ситуация.

Для решения этой проблемы вам необходимо обнулить этот байт (28-й десятичный байт) в файле DBF, избавляющий таблицу от зависимости MDX-файла.
Читать полностью…

Автор: admin | в 2:14 | Рубрики: Базы данных

Упаковка таблиц dBASE требует вызова BDE функции DbiPackTable. Пример ее использования показан ниже, включая проверку на ошибки. Чтобы воспользоваться функцией DbiPackTable, вызывающий модуль должен в своей секции uses иметь модули-обертки BDE DbiTypes, DbiErrs и DbiProcs.

При неудачном вызове DbiPackTable, сообщение об ошибке не генерится. Для того, чтобы понять как функция сработала, вам необходимо проверить возвращаемое ею значение. В случае успешного выполнения возвращаемое значение равно DBIERR_NONE. Любое другое значение указывает на ошибку, а с помощью него можно определить саму ошибку, ее причину, и наметить действия, необходимые для ее устранения.

Вот сам пример:

procedure TForm1.Button1Click(Sender: TObject);
var
Error: DbiResult;
ErrorMsg: string;
Special: DBIMSG;
begin
table1.Active := False;
try
Table1.Exclusive := True;
Table1.Active := True;
Error := DbiPackTable(Table1.DBHandle, Table1.Handle, nil, szdBASE, True);
Table1.Active := False;
Table1.Exclusive := False;
finally
Table1.Active := True;
end;
case Error of
DBIERR_NONE:
ErrorMsg := ‘Успешно’;
DBIERR_INVALIDPARAM:
ErrorMsg := ‘Указанное имя таблицы или указатель на имя таблицы ‘ +
‘равен NULL’;
DBIERR_INVALIDHNDL:
ErrorMsg := ‘Указанный дескриптор базы данных или курсора ‘ +
‘неверен или равен NULL’;
DBIERR_NOSUCHTABLE:
ErrorMsg := ‘Таблица с таким именем не существует’;
DBIERR_UNKNOWNTBLTYPE:
ErrorMsg := ‘Неизвестный тип таблицы’;
DBIERR_NEEDEXCLACCESS:
ErrorMsg := ‘Таблица открыта не в эксклюзивном режиме’;
else
DbiGetErrorString(Error, Special);
ErrorMsg := ‘[’ + IntToStr(Error) + ‘]: ‘ + Special;
end;
MessageDlg(ErrorMsg, mtWarning, [mbOk], 0);
end;

Автор: admin | в 2:14 | Рубрики: Базы данных

Для упаковки таблицы dBASE, открытой с помощью TTable, воспользуйтесь функцией BDE DbiPackTable. Для этого достаточно сделать две операции:

Добавьте в секцию uses следующие модули:
{ Для Delphi 1.0: } DBITYPES, DBIPROCS и DBIERRS;
{ Для Delphi 2.0: } BDE;

Затем вызовите BDE функцию DbiPackTable следующим образом:

Check(DbiPackTable(Table1.DbHandle, Table1.Handle, Nil, szDBASE, TRUE));

Примечания:

Таблица должна быть открыта в эксклюзивном режиме.
При вызове функций API BDE используйте процедуру Check. Check в случае ошибки при вызове BDE генерирует исключительную ситуацию.

Автор: admin | в 2:14 | Рубрики: Базы данных

Для dBase:

uses
DbiProcs;

with Table do
begin
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.db

var
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;

// можно еще чеки ввести, но облом :-)

Автор: admin | в 2:14 | Рубрики: Базы данных

Автор: OAmiry (Borland)

Упакуй, Господи, душу его…

Для упаковки таблицы dBASE убедитель в том, что таблица открыта в монопольном (exclusive) режиме и вызывайте DbiPackTable. Пример:

Table1.Close ;
Table1.Exclusive := TRUE ;
Table1.Open ;
DbiPackTable( Table1.DBHandle, Table1.Handle, nil, nil, TRUE ) ;

Убедитесь, что DBITYPES, DBIPROCS, DBIERRS включены в секцию USES вашего модуля и, в случае запуска из-под IDE, в режиме проектирования таблица не активна.