Обновление таблицы Paradox во время выполнения

В настоящее время я использую следующий метод, чтобы добавить поле в таблицу парадоксов во время выполнения.

procedure TfrmMain.AddField(UpdTable, FieldName, FieldType: string);
begin
 with qryUpdate do
 begin
  Close;
  ParamByName('UPDTABLE').AsString := UpdTable;
  ParamByName('FLDNAME').AsString  := FieldName;
  ParamByName('FLDTYPE').AsString  := FieldType;
  ExecSQL;
  Open;
 end;
end;

procedure TfrmMain.FormShow(Sender: TObject);
begin
  AddField('Test','newfield', 'VARCHAR(30)');
end;

В компоненте под названием «qryUpdate» у меня есть следующий запрос:

ALTER TABLE :UPDTABLE
ADD :FLDNAME :FLDTYPE

Однако при выполнении запроса отображается следующее сообщение:

Недопустимое использование ключевого слова.

Токен: ?

Номер строки: 1.

Что я делаю неправильно?

Другой (связанный) вопрос: не повредит ли добавление подобных полей в существующую базу данных существующим полям/данным?


person Community    schedule 13.05.2012    source источник
comment
Вы пытались запустить SQL вне вашего приложения. или следить за этим?   -  person Shaun07776    schedule 13.05.2012
comment
Я только что выполнил запрос (я заменил все параметры теми, которые я передаю ему с помощью программы), и он работал нормально.   -  person    schedule 14.05.2012


Ответы (1)


Вы можете добавить поле в таблицу только один раз! Ваш код, как написано, будет пытаться добавить поле каждый раз, когда вы запускаете программу. Прежде чем добавлять новое поле, вы должны сначала проверить, сколько полей содержит ваша таблица.

Раньше я использовал следующий код для добавления полей во время выполнения (это для таблиц BDE/Paradox)

with ttable.create (nil) do
 try
  databasename:= 'whatever';
  tablename:= 'test.db';
  open;
  fc:= fieldcount;
  close;
 finally
  free
 end;

if fc = 7 then
 with tquery.create (nil) do
  try
   databasename:= 'whatever';
   close;
   sql.add ('alter table "test.db" add newfield varchar (30)');
   execsql
  end;
   finally
  free
 end;

Обратите внимание, что мой синтаксис оператора «alter table» отличается от вашего — имя таблицы заключено в кавычки и включает расширение файла.

person No'am Newman    schedule 14.05.2012
comment
Это приложение предназначено для обновления другого программного обеспечения, которое я написал, поэтому оно добавляет их при запуске. Когда я вернусь сегодня вечером, я попробую ваш код, возможно, поместив его в процедуру, чтобы я мог вызывать его несколько раз для разных полей. Также могу я спросить, почему вы выбираете количество полей и используете его, чтобы определить, следует ли добавлять поле или нет? - person ; 14.05.2012
comment
@MoonPunch: проверка количества полей позволяет мне узнать, было ли уже добавлено поле. - person No'am Newman; 14.05.2012
comment
Не могли бы вы выполнить оператор if для имени поля, чтобы определить, существует ли указанное поле вместо целого числа? - person ; 15.05.2012