3

我无法正确执行以下脚本。它在 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 字符串中包含默认值是可行的,但此代码用作更大框架的一部分,并且该选项是最后的手段。

4

1 回答 1

5

您收到令牌未知错误的原因是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是一些包含所需默认值的整数变量。

于 2016-11-01T22:05:10.563 回答