2014-09-01 51 views
0

比方说你有,有一个TEDIT其中一个用户类型和SQL查询获取查询字符串的PARAMS和数据类型

SELECT * FROM X WHERE X.A = :A and X.B = :B and X.C= :C 

有没有办法让类型的德尔福接口:一,: B,:C Params?我设法得到了参数的名称。使用此代码

procedure TfrmA.Button1Click(Sender: TObject); 
var 
    queryInput, queryOutput , aux : string; 
    pozitie : Integer; 
    param : string; 
    Ch,Chx : Char; 
begin 
    queryInput := TEdit.Text; 
    queryOutput := StringReplace(queryInput,':','@',[rfReplaceAll, rfIgnoreCase]); 
    aux := Copy(queryOutput,AnsiPos('@',queryOutput),200); 
    while Length(aux) > 0 do begin 
    if AnsiPos('@',aux) = 0 then break; 
    for Ch in aux do 
    begin 
     if Ch = ' ' then begin 
     param := param + ' '; 
     break 
     end else param := param + Ch; 
    end; 
    ShowMessage(param); 
    test := Copy(test,2,200); 
    test := Copy(test,AnsiPos('@',test),200); 
    end; 
end; 

帕拉姆字符串现在containt:@A @B @C

反正是有,我可以找出则params的数据类型?

+0

您将需要告知现场和表格来了解数据类型 – Passella 2014-09-01 14:03:35

+0

你问过类似的问题,最近,在这种情况下,你需要的'sp_describe_undeclared_pa​​rameters '函数来检索数据类型。 – whosrdaddy 2014-09-01 14:19:24

+0

挑剔的评论,如果你使用D2009或更高版本,你应该摆脱'AnsiPos'并使用'Pos'函数。 – whosrdaddy 2014-09-01 14:20:42

回答

1

如果您可以使用Adodataset,您可以使用它来获取所需的信息。 使用TypInfo;

procedure TForm5.Button1Click(Sender: TObject); 
var 
i:Integer; 
begin 
    Ads.CommandText := 'Update Adressen set geboren=:birthdate where name=:n and ID=:i'; 
    Memo1.Lines.Clear; 
    for I := 0 to Ads.Parameters.Count - 1 do 
     begin 
     Memo1.Lines.Add(Ads.Parameters[i].Name + ' : ' + GetEnumName(TypeInfo(TDataType), Integer(Ads.Parameters[i].DataType)) + ' : '+ IntToStr(Ads.Parameters[i].Size)) 
     end; 
end; 

例子的输出将是:

birthdate : ftDateTime : 16 
n : ftWideString : 40 
i : ftInteger : 4 
+0

明天我会试试,谢谢! – CiucaS 2014-09-01 18:43:02

+0

它似乎不会看到任何参数。程序TfrmRapoarte.est21Click(发件人:TObject); var i:整数; 广告:TADODataSet; param:string; 开始 广告:= TADODataSet.Create(Self); param:='SELECT * FROM X where A =:A and YEAR(B)=:B and C =:C'; Ads.CommandText:= param; (Ads.Parameters [i] .Name +':'+ GetEnumName(TypeInfo(TDataType),Integer(Ads.Parameters []) i] .DataType))+':'+ IntToStr(Ads.Parameters [i] .Size)); 结束; 结束; – CiucaS 2014-09-02 06:14:41

+2

你必须在设置commandtext之前定义一个连接:'Ads.Connection:= AdoConnection1;' – bummi 2014-09-02 08:42:32

相关问题