如何将TADOQuery.Parameters与整数参数类型一起使用,这些参数类型必须放在查询的两个或多个位置?

时间:2011-09-30 17:18:23

标签: delphi ado tadoquery

我有一个复杂的查询,其中包含多个必须替换相同主键值的位置。它看起来像这样:

select  Foo.Id,
        Foo.BearBaitId,
        Foo.LinkType,
        Foo.BugId,
        Foo.GooNum,
        Foo.WorkOrderId,
        (case when Goo.ZenID is null or Goo.ZenID=0 then
            IsNull(dbo.EmptyToNull(Bar.FanName),dbo.EmptyToNull(Bar.BazName))+' '+Bar.Strength else
            '@'+BarZen.Description end) as Description,
        Foo.Init,
        Foo.DateCreated,
        Foo.DateChanged,
        Bug.LastName,
        Bug.FirstName,
        Goo.BarID,
        (case when Goo.ZenID is null or Goo.ZenID=0 then
             IsNull(dbo.EmptyToNull(Bar.BazName),dbo.EmptyToNull(Bar.FanName))+' '+Bar.Strength else
             '@'+BarZen.Description end) as BazName,
        GooTracking.Status as GooTrackingStatus
  from
    Foo
  inner join Bug on (Foo.BugId=Bug.Id)
  inner join Goo on (Foo.GooNum=Goo.GooNum)
  left join Bar on (Bar.Id=Goo.BarID)
  left join BarZen on (Goo.ZenID=BarZen.ID)
  inner join  GooTracking on(Goo.GooNum=GooTracking.GooNum )
 where (BearBaitId = :aBaitid) 
UNION
 select Foo.Id,
        Foo.BearBaitId,
        Foo.LinkType,
        Foo.BugId,
        Foo.GooNum,
        Foo.WorkOrderId,
        Foo.Description,
        Foo.Init,
        Foo.DateCreated,
        Foo.DateChanged,
        Bug.LastName,
        Bug.FirstName,
        0,
        NULL,
        0
 from Foo
 inner join Bug on (Foo.BugId=Bug.Id)
  where (LinkType=0)  and (BearBaitId= :aBaitid ) 
order by BearBaitId,LinkType desc, GooNum

当我尝试在这个非平凡的查询中使用整数参数时,对我来说似乎是不可能的。我收到这个错误:

Error

Incorrect syntax near ':'.

如果我取出:aBaitid并替换文字1,查询就可以正常工作。

我可以对上面的查询做些什么吗?当我用这样的简单测试进行测试时:

select * from foo where id = :anid

这些简单的案例运作良好。该组件是TADOQuery,它可以正常工作,直到您向SQL字符串添加任何:parameters

更新:当我在运行时使用以下代码时,实际完成了参数替换(ADO组件中的一些小故障可以解决)和不同的错误表面:

adoFooContentQuery.Parameters.FindParam('aBaitId').Value := 1;
adoFooContentQuery.Active := true;

现在错误更改为:

Incorrect syntax near the keyword 'inner''.

再次注意,如果我只是停止使用参数替换功能,则此错误会消失。

Update2:接受的答案显示我必须找到两个不同的参数副本,这些副本具有相同的名称,这让我感到困扰,所以我重写了这样的查询:

 DECLARE @aVar int;
 SET @aVar = :aBaitid;
 SELECT ....(long query here)

然后我在需要的整个脚本中使用了@aVar,以避免重复使用:aBaitId。 (如果使用参数值的次数发生变化,我不希望找到与名称匹配的所有参数,并替换它们)。

我认为像这样的辅助函数也可以:SetAllParamsNamed(aQuery:TAdoQuery; aName:String;aValue:Variant)

1 个答案:

答案 0 :(得分:2)

FindParam只找到一个参数,而你有两个同名的参数。 Delphi数据集将每个参数作为单独的参数添加到其参数集合中。

如果遍历所有参数, 应该工作,检查名称是否匹配,并设置匹配的每个参数的值,尽管我通常选择为每个相同的参数提供一个后续编号在他们之间纠缠不清。