2017-06-01 35 views
1

我正在处理包含一些TQuery组件的遗留代码。我试图创建一个函数,将TQuery参数转换为TParameters,以便我可以将它们分配给ADO组件的参数属性(如ADOQuery或ADODataSet)。如何将TParams(TQuery)对象转换为TParameters(ADO)对象。

我尝试了以下我从互联网上得到的。

function ConvertToADOParms(Owner: TADODataset; aParams: TParams): TParameters; 

var i: integer; 

begin 
// Convert a standard TParams object to an ADO-specific TParameters object 
Result :=nil; 
try 
    if aParams = nil then exit; 
    Result :=TParameters.create(Owner, TParameter); 
    for i:=0 to aParams.count - 1 do 
    begin 
    if aParams[i] = nil then continue; 
    with Result.AddParameter do 
    begin 
     Name := aParams[i].Name; 
     Datatype :=aParams[i].DataType; 
     Direction :=TParameterDirection(aParams[i].ParamType); 
     Size :=aParams[i].size; 
     Value :=aParams[i].value; 
    end; 
    end; 
except 
    on e:exception do 
    begin 
    Result :=nil; 
    showmessage('Could not convert standard parameter object to ADO parameter object: '+e.message); 
    end; 
end; 
end; 

但我得到无效的类类型错​​误。当我调试代码时,我发现在ADODB单元中的此功能发生错误

function TParameters.GetCommand: TADOCommand; 
begin 
    Result := GetOwner as TADOCommand; 
end; 

帮助请。我正在使用德尔福5

+0

@维多利亚非常感谢这对我有效。所以问题是由于覆盖? –

回答

2

我没有多少意义的功能原型。它要求所有者收集该函数返回的集合,因此恕我直言应该是独立的。

我只是简单地摆脱它,并直接使用传递的ADO对象进行操作。例如:

procedure FillParamsADO(Params: TParams; Dataset: TADODataset); 
var 
    i: Integer; 
begin 
    Dataset.Parameters.Clear; 
    for i := 0 to Params.Count-1 do 
    begin 
    with Dataset.Parameters.AddParameter do 
    begin 
     Name := Params[i].Name; 
     DataType := Params[i].DataType; 
     Direction := TParameterDirection(Params[i].ParamType); 
     Size := Params[i].Size; 
     Value := Params[i].Value; 
    end; 
    end; 
end;