gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:19:45 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com