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

标签 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,在您将任何 :parameters 添加到 SQL 字符串之前它都可以正常工作。

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

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

现在错误变为:

Incorrect syntax near the keyword 'inner''.

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

更新2:接受的答案表明我必须找到具有相同名称的参数的两个不同副本,这让我很困扰,所以我像这样重新设计了查询:

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

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

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

最佳答案

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

如果您循环遍历所有参数,检查名称是否匹配,并设置每个匹配的值,它应该可以工作,尽管我通常选择为每个相同的参数提供一个后续编号来区分它们。

关于delphi - 如何将 TADOQuery.Parameters 与必须放在查询中两个或多个位置的整数参数类型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7613832/

相关文章:

delphi - TADOQuery: 'EDatabaseError type mismatch for field ' MyField',期望:字符串实际:FixedWideChar'

delphi - DynArraySize() 仅能正确运行最多 649 个整数元素的数组

delphi - 什么是重置(句柄,1)?

delphi - 有没有办法知道编辑状态下的TAdoQuery是否被更改?

delphi - 更改adoquery.active时条件表达式中的数据类型不匹配

vba - 如何更改 ADO 记录集字段的数据类型?

delphi - 用于 Delphi 和自定义样式的 Windows Ribbon Framework

delphi - 将 Delphi 构造函数作为普通方法调用 - 任何隐藏的副作用?

delphi - 压缩 Access 数据库

VBA ADO 连接到 .xlsx 文件