Получение ошибки при использовании параметра с помощью сценария anydac (теперь firedac) для firebird

Я не могу заставить следующий скрипт выполняться без ошибок. Он выполняется в delphi для базы данных Firebird.

var
  vScript: TADScript;

begin
  vScript := TADScript.Create(nil);
  vScript.Connection := xConnection;
  vScript.Transaction := xTransaction;

  with vScript.Params.Add do
    begin
      Name := 'DEFVAL'; // also tried ':DEFVAL'
      AsInteger  := 1;
    end;

  with vScript.SQLScripts.Add do
    SQL.Text := 'ALTER TABLE "PERSON" add "AGE" INTEGER DEFAULT :DEFVAL';

  vScript.ValidateAll;
  vScript.ExecuteAll;
end

Выдает ошибку "Токен неизвестен - строка 1, столбец 48", параметр (:DEFVAL) расположение

Я попытался назначить SQL-текст, а затем вызвать Params.FindParam, но его нет в списке. Это работает для запросов.

Не использование параметров и просто включение значения по умолчанию в строку SQL работает, но этот код используется как часть большей работы с фреймами, и этот вариант является последним средством.

1 ответ

Решение

Причина, по которой вы получаете токен неизвестной ошибки, состоит в том, что ALTER TABLE операторы не позволяют использовать параметры таким способом.

Вам нужно будет согласовать строковое значение по умолчанию с ALTER TABLE заявление. Поскольку ваш код безоговорочно применяет значение по умолчанию 1 в этом случае это можно просто включить в литерал оператора:

with vScript.SQLScripts.Add do
  SQL.Text := 'ALTER TABLE "PERSON" add "AGE" INTEGER DEFAULT 1';

Если вам действительно нужно учитывать потенциально переменные значения по умолчанию, тогда, очевидно, это нужно будет изменить на что-то похожее на:

with vScript.SQLScripts.Add do
  SQL.Text := Format('ALTER TABLE "PERSON" add "AGE" INTEGER DEFAULT %i', [iDefaultValue]);

Где iDefaultValue - некоторая целочисленная переменная, содержащая требуемое значение по умолчанию.

Другие вопросы по тегам