при упаковке таблицы dbf возникает ошибка: файл используется - PullRequest
0 голосов
/ 07 ноября 2019

При попытке сделать запрос выдается ошибка:

Файл используется

Как мне решить эту программу?

 procedure TForm1.Button4Click(Sender: TObject);
 var data,ffg:string;
 begin
 data:=formatdatetime('ddmm',(DateTimePicker1.Date));
 Adoquery2.SQL.Clear;
 adoquery2.SQL.text:='Delete from g_rabn where data=data';// deleting data from g_rabn
 adoquery2.ExecSQL;
 ShowMessage(SysErrorMessage(GetLastError));

 end;
 procedure TForm1.Button5Click(Sender: TObject);
 begin
 Adoquery3.close;
 Adoquery3.SQL.Clear;
 adoquery3.SQl.text:='pack table g_rabn';// packing tablr g_rabn
 adoquery3.Open;
 ShowMessage(SysErrorMessage(GetLastError));
 end;

 end.

Я не могу удалить данные из таблицы, они помечены как удаленные, но требуют упаковки. Как это сделать программно? Он пишет что файл используется при упаковке что делать?

Ответы [ 2 ]

3 голосов
/ 07 ноября 2019

Вы должны выполнить инструкцию, а не открывать ее как запрос. Одним из способов достижения этого является запуск его с использованием TADOCommand, а не TADOQuery, или использование метода ExecSQL в TADOQuery.

Кроме того, все другие соединения с DBF должны быть закрыты, в противном случае вы можетеПолучите эксклюзивный доступ, необходимый для упаковки таблицы.

Я нашел эту ветку 2005 года на другом форуме , где кто-то сделал эту работу с двумя известными параметрами:

  • Использование провайдера VFPOLEDB.1
  • Использование только команды pack filename.dbf (без ключевого слова table).

Наконец, я не уверено линии ShowMessage(SysErrorMessage(GetLastError));. Это покажет вам последнюю ошибку API, но это на низком уровне. Вы используете компоненты ADO, поэтому, если что-то идет не так, вы должны ожидать, что ADO выдаст исключение. Насколько вам известно, ADO уже так или иначе обошел проблему, и сообщение об ошибке, которое вы видите, даже не имеет значения.

2 голосов
/ 08 ноября 2019

Я удивлен, что мне не удалось получить решение, предложенное в ответе Голеса Троя на работу, особенно в связи с публикацией в группе новостей от кого-то, кому, по-видимому, удалось упаковать таблицу 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, но, по-видимому, не был установлен по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...