使用Delphi 10.2 (东京),我只想做一些简单的事情,比如:
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'
有办法吗?
发布于 2020-06-01 19:18:20
TFDQuery.Params是一个TFDParams,它可以使用循环播放来迭代,因为它有一个公共的GetEnumerator()方法。但是,该方法是从TCollection继承来迭代TCollectionItem项的,因此它不是专门针对TFDParam项的(请放心,提交错误报告可以了解这种疏忽)。
因此,当循环迭代试图将枚举数的Current属性分配给您的oParam变量时,它无法编译,因为TCollectionItem不能分配给TFDParam。这正是编译器错误所抱怨的。
您的代码基本上被编译为-如果它是这样编写的:
function ShowFinalSQL(const qry: TFDQuery): String;
var
cSQL: String;
oParam: TFDParam;
cEnum: TCollectionEnumerator;
begin
cSQL := qry.SQL.Text;
//for oParam in qry.Params do
cEnum := qry.Params.GetEnumerator;
while cEnum.MoveNext do
begin
oParam := cEnum.Current; // <-- ERROR HERE - cEnum.Current is TCollectionItem!
cSQL := cSQL.Replace(oParam.Name, oParam.Value);
end;
Result := cSQL;
end;要解决这个问题,需要将oParam变量更改为TCollectionItem而不是TFDParam。当您想访问任何TFDParam-specific成员时,您只需键入它,例如:
function ShowFinalSQL(const qry: TFDQuery): String;
var
cSQL: String;
oParam: TCollectionItem;
begin
cSQL := qry.SQL.Text;
for oParam in qry.Params do
cSQL := cSQL.Replace(TFDParam(oParam).Name, TFDParam(oParam).Value);
Result := cSQL;
end;另一种选择是:
function ShowFinalSQL(const qry: TFDQuery): String;
var
cSQL: String;
oItem: TCollectionItem;
oParam: TFDParam;
begin
cSQL := qry.SQL.Text;
for oItem in qry.Params do
begin
oParam := TFDParam(oItem);
cSQL := cSQL.Replace(oParam.Name, oParam.Value);
end;
Result := cSQL;
end;UPDATE:或者,如果您希望避免手动类型转换,则可以使用absolute。
function ShowFinalSQL(const qry: TFDQuery): String;
var
cSQL: String;
oItem: TCollectionItem;
oParam: TFDParam absolute oItem;
begin
cSQL := qry.SQL.Text;
for oItem in qry.Params do
begin
cSQL := cSQL.Replace(oParam.Name, oParam.Value);
end;
Result := cSQL;
end;https://stackoverflow.com/questions/62136741
复制相似问题