我在从程序用户在运行时定义的查询中获取字段列表时遇到问题。我让我的用户在memo控件中输入SQL查询,然后我想让他们遍历将返回的字段,并执行格式化输出、求和列值等操作。因此,我必须获取列名,以便它们有位置输入附加信息。
如果没有参数,我会做得很好,但我还必须让它们为查询定义过滤器参数。因此,如果我想将参数设置为null,我必须知道参数的数据类型是什么。
我使用的是Delphi 2006。我使用DBExpress组件TSQLConnection和TSQLQuery连接到Firebird 2.1数据库。在此之前,我成功地使用了:
for I := 0 to Qry.Params.Count -1 do Qry.Paramsi.value := varNull;
当我尝试使用日期参数时,我发现我有一个问题。在此之前,我的所有参数都是整数(记录ID),这只是个巧合。事实证明,varNull只是一个值为1的枚举常量,所以我得到的结果是可接受的(没有记录)工作正常。
我只需要一份字段列表。也许我应该只解析SQL语句的SELECT子句。我以为将Qry.Prepared设置为True会得到一个字段列表,但没有这么幸运。它需要参数的值。
如果你有什么想法,我很想听听。谢谢你的帮助。
发布于 2008-11-05 06:43:16
再次回答:“因为我很感兴趣。我的方法(对我的查询)是有效的,因为它们已经预定义了params的数据类型,预设为正确的类型:)
我不确定您希望查询如何知道或派生参数的数据类型,因为您甚至没有选择它所操作的字段。
所以我认为你的查询设置和用户输入方法需要更多的关注。我刚刚查了一下我之前是怎么做到的。我不使用参数化查询-我只是从用户那里获得“参数值”,并将它们直接放入SQL中。因此,您的sql将显示为:
选择s.hEmployee、e.sLastName
FROM PR\_Paystub s
INNER JOIN PR\_Employee e ON e.hKey = s.hEmployee
WHERE s.dtPaydate > '01/01/2008'
因此,不需要参数类型知识。不会阻止您的用户输入垃圾,但这会返回到输入控制:)
发布于 2008-11-04 02:01:31
尽管数据集类型略有不同,但这是我在TClientDataset中使用的简单而有效的数据集类型:)
for i := 0 to FilterDataSet.Params.Count -1 do
begin
Case FilterDataSet.Params.Items[i].Datatype of
ftString:
ftSmallint, ftInteger, ftWord:
ftFloat, ftCurrency, ftBCD:
ftDate:
ftTime:
ftDateTime:
.
.
.
end;
结束;
您可以不对查询执行类似的操作吗?
发布于 2008-11-04 05:19:17
你们让这个way变得太难了:
for i := 0 to Qry.Params.Count - 1 do begin
Qry.Params[i].Clear;
Qry.Params[i].Bound := True;
end;
https://stackoverflow.com/questions/260521
复制相似问题