Я удивлен, что мне не удалось получить решение, предложенное в ответе Голеса Троя на работу, особенно в связи с публикацией в группе новостей от кого-то, кому, по-видимому, удалось упаковать таблицу dBASE с помощью ADO;как я сказал в комментарии, если я пытаюсь вызвать 'Pack xxxx' для упаковки таблицы dBASE через ADO, как бы я это ни делал, я получаю
Invalid SQL Statement;Ожидается УДАЛЕНИЕ, ВСТАВКА, ПРОЦЕДУРА, ВЫБОР или ОБНОВЛЕНИЕ.
Я также был удивлен, обнаружив кое-что в документах MS ODBC dBASE , которые я не заметил раньше, а именно, чтоДрайвер MS ODBC для файлов dBASE требует BDE
Примечание. Для доступа к файлам dBASE ISAM через ODBC Desktop Database Driver требуется установка ядра базы данных Borland
Таким образом, учитывая, что для доступа к файлам dBASE через Ado в любом случае требуется BDE, мне кажется, что нет смысла избегать использования BDE для упаковки таблицы dBASE с использованием стандартного метода BDE, а именно вызова DbiPackTable. Я добавил TDatabase и TTable в свой тестовый проект ADO, после чего я смог выполнить этот код без проблем
procedure TForm1.Button2Click(Sender: TObject);
begin
try
// Insert code here to close any Ado object (TAdoConnection, TAdoCommand, etc) pointing
// at the dBASE table/file
// Also check that not Ado object pointing at it is open in the IDE
//
// Then ...
Database1.DatabaseName := 'MADBF2';
Database1.Connected := True;
Table1.TableName := 'MATest.Dbf';
Table1.Exclusive := True;
Table1.Open;
// Following uses a call to DbiPackTable to pack the target table
Check(DbiPackTable(Table1.DBHandle, Table1.Handle, nil, nil,True));
finally
Table1.Close;
Database1.Connected := False;
end;
end;
FWIW, когда я писал этот ответ, я заметил, что файл BDE.Int(который содержит объявления, но не реализацию интерфейса BDE) был на компакт-диске с дистрибутивом D7, но, по-видимому, не был установлен по умолчанию).