[使用Delphi 10.2(Tokyo),我只想做一些简单的事情:
function ShowFinalSQL(const qry: TFDQuery): String;
var
cSQL: String;
oParam: TFDParam;
begin
cSQL := qry.SQL.Text;
for oParam in qry.Params do
cSQL := cSQL.Replace(oParam.Name, oParam.Value);
Result := cSQL;
end;
但是我总是收到错误消息:
[dcc32 Error] DTUtilBD.pas(3115): E2010 Incompatible types: 'TFDParam' and 'TCollectionItem'
有办法吗?
简短的回答:否,不使用in
(为什么不这样做,请参见下文),但是一个好的老式数字for
循环会正常工作:
function ShowFinalSQL(const qry: TFDQuery): String;
var
cSQL: String;
// oParam: TFDParam;
i : Integer;
begin
cSQL := qry.SQL.Text;
for i := 0 to qry.ParamCount - 1 do
cSQL := cSQL.Replace(qry.Params[i].Name, qry.Params[i].Value);
Result := cSQL;
end;
for .. in
不适用于类型为TFDParams的FDQuery的Params类的原因是,无论出于何种原因,TFDParams类都不提供“ GetEnumerator方法,该方法返回一个提供Next
方法的对象,并且Current
属性”,根据Marco Cantu出色的Delphi 2007手册进行。
顺便说一句,您可能会发现Nick Hodge's article关于for ... in
很有趣。
[TFDParams
可以用for..in
循环进行迭代,只是不是您尝试的方式。
TFDParams
具有公共的GetEnumerator()
方法,但是它是从GetEnumerator()
继承来迭代TCollection
项目的方法。它不是专门用于TCollection
项目的。因此,这意味着您用于迭代的变量需要声明为TFDParam
而不是TCollectionItem
。这意味着您将必须强制转换变量以访问任何TFDParam
特定成员。
尝试一下:
TFDParam