【发布时间】:2014-10-20 17:43:56
【问题描述】:
我正在运行一个通过 FireDAC 连接的 IB 数据库。
以下动态查询有效:
INSERT INTO RELATIONS (C_ID, M_ID, A_ID)
SELECT c.C_ID, 0, a.A_ID
FROM CATEGORIES c, ACTIONS a
WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION
我在 RELATIONS A_INDEX(Integer) 中添加一列。对于这个专栏,我想提供一个参数,所以我这样做:
INSERT INTO RELATIONS (C_ID, M_ID, A_ID, A_INDEX)
SELECT c.C_ID, 0, a.A_ID, :A_INDEX
FROM CATEGORIES c, ACTIONS a
WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION
但这不起作用。出于某种原因,当我执行查询时,它抱怨CATEGORY 参数存在转换错误。
这是此查询操作的完整代码:
procedure Test;
var
Query: TFDQuery;
begin
Query := TFDQuery.Create(nil);
try
Query.Connection := DBDataModule.dbMain;
Query.ResourceOptions.ParamCreate := False;
Query.SQL.BeginUpdate;
Query.SQL.Add('INSERT INTO RELATIONS (C_ID, M_ID, A_ID, A_INDEX)');
Query.SQL.Add('SELECT c.C_ID, 0, a.A_ID,:A_INDEX');
Query.SQL.Add('FROM CATEGORIES c, ACTIONS a');
Query.SQL.Add('WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION');
Query.SQL.EndUpdate;
Query.Params.CreateParam(TFieldType.ftInteger, 'A_INDEX', ptInput);
Query.Params.CreateParam(TFieldType.ftFixedWideChar, 'CATEGORY', ptInput);
Query.Params.CreateParam(TFieldType.ftFixedWideChar, 'ACTION', ptInput);
Query.ParamByName('CATEGORY').Size := 255;
Query.ParamByName('ACTION').Size := 255;
Query.Prepare;
Query.ParamByName('A_INDEX').Value := 0;
Query.ParamByName('CATEGORY').Value := 'Foo';
Query.ParamByName('ACTION').Value := 'Foo';
Query.ExecSQL; // <-- Exception
finally
Query.Free;
end;
end;
我还在学习 SQL、数据库和 FireDAC,所以我真的不明白为什么它允许我在 select 语句中输入直接值,但参数是不行的。
我还能如何使用第一个查询将参数动态插入A_INDEX 列?
【问题讨论】:
-
您是手动创建参数还是使用“Query.ResourceOptions.ParamCreate := True;” ?
-
@valex,当你问我这个问题时,我的参数是自动创建的,Vitor 建议我手动做,所以我做了,没有改变。我已经用完整的代码更新了我的问题。
-
我现在无法检查这个,但我想这里的问题是
:A_INDEX被放置在 SELECT 列表中。尝试将您的查询更改为例如INSERT INTO RELATIONS (C_ID, M_ID, A_ID, A_INDEX) SELECT c.C_ID, 0, a.A_ID, 0 FROM CATEGORIES c, ACTIONS a WHERE c_id=:A_INDEX AND c.NAME = :CATEGORY AND a.NAME = :ACTION,我认为它会运行良好而不会出现任何错误。 -
@valex,我认为你不明白我的问题。我需要动态更改
A_INDEX列的值,我不能让它为0。还有c_id = :A_INDEX是错误的。c_ID是表 Relations 中的外键,并绑定到表 Categories 中的主键c_ID。我的问题是,为什么我可以在 Select 语句中为列设置一个值,但我显然不能在其中放置一个参数? -
我了解您的问题,我认为这是一个错误,
:A_INDEX未处理,因为它在 SELECT 列表中。因此,我认为您应该尝试在 WHERE 部分中的所有参数的位置做出此声明,并且我认为它将运行而不会出错。在这种情况下,将使用相同的参数集和相同的顺序 (:A_INDEX,:CATEGORY,:ACTION),因此您将找到此问题的根源。
标签: sql delphi delphi-xe6 interbase firedac