2014-09-01 3 views
0

는 이제 당신이 사용자 유형 및 SQL 쿼리QueryString을의에 Params과 데이터 유형을 가져

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

이의 종류를 얻을 수있는 방법이 있나요 인은 TEdit이있는 델파이 인터페이스를 가지고 있다고 가정 해 봅시다 :, : B, : C Params? 나는 그럭저럭 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; 

파람 문자열은 지금이 (가) 포함됩니다이 코드를 사용 : @A @B @C

내가 PARAMS의 데이터 유형을 찾을 수 있습니다 어쨌든 있나요?

+0

당신이'sp_describe_undeclared_parameters 필요이 경우, 최근 비슷한 질문을 데이터 유형 – Passella

+0

를 알 수 있도록 필드와 테이블을 통보해야합니다 '함수를 사용하여 데이터 유형을 검색합니다. – whosrdaddy

+0

D2009 이상을 사용하는 경우, AnsiPos를 제거하고 대신'Pos' 함수를 사용해야합니다. – whosrdaddy

답변

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

+0

그것은 어떤 매개 변수도 보지 않을 것 같습니다. procedure TfrmRapoarte.est21Click (보낸 사람 : TObject); var i : 정수; 광고 : TADODataSet; param : string; begin 광고 : = TADODataSet.Create (Self); param : = 'SELECT * FROM X 여기서 A = : A 및 YEAR (B) = : B 및 C = : C'; Ads.CommandText : = param; (Ads.Parameters [i] .Name + ':'+ GetEnumName (TypeInfo (TDataType), Integer (Ads.Parameters [TDataType])) : 에 대한 Ads.Parameters.Count - 1 do begin Memo1.Lines.Add i] .DataType)) + ':'+ IntToStr (Ads.Parameters [i] .Size)); 끝; 끝; – CiucaS

+2

커맨드 텍스트를 설정하기 전에 연결을 정의해야합니다 :'Ads.Connection : = AdoConnection1;' – bummi