使用带有anydac(现在为firedac)脚本的参数获取错误

Posted

技术标签:

【中文标题】使用带有anydac(现在为firedac)脚本的参数获取错误【英文标题】:Getting error using a parameter with anydac (now firedac) script for firebird 【发布时间】:2016-11-01 20:37:35 【问题描述】:

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

【问题讨论】:

正如建议,尽量不要使用 with 语句。只是为了让代码更具可读性 我完全同意 with 声明。由于某种原因,当我找到使用任何 dac 组件的示例代码时,我只是保留了它们:P 【参考方案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 是一些整数变量,保存所需的默认值。

【讨论】:

作为替代使用 AnyDACs 宏功能而不是参数。 谢谢。这就解释了。我将不得不修改字符串而不是使用参数。谢谢 Uwe Raabe,我会研究 AnyDAC 的宏功能。 看了 TADMAcro 之后,我认为这就是我要走的路。再次感谢。

以上是关于使用带有anydac(现在为firedac)脚本的参数获取错误的主要内容,如果未能解决你的问题,请参考以下文章

从 Anydac 移动到 Firedac 时 NULL 丢失

使用 AnyDAC (FireDAC) 从 SQLite 表中读取切片数据 (MBTiles) 的最有效方法是啥?

AnyDAC (FireDAC) - 在 TBlobField.GetAsString 之后打开事务

AnyDac aka FireDac 无法生成更新查询

AnyDac - 如何断开与内存中的 sqlite db 的连接?

带有 MS Access 2010 数据库的 Delphi FireDAC。为啥它将 ACE 转换为 Jet?