2011-12-21 3 views
1

저는 직장에서 델파이 프로그램이하는 일을 변경하는 임무가 있습니다. 응용 프로그램은 너무 많은 mysql 서버를 연결하는 데 사용되며, ado로 쿼리를 실행합니다. 이제 서버가 외부 연결을 허용하지 않는 것으로 변경되었으므로 응용 프로그램을 웹 서비스에 연결하고 거기서 mysql 업데이트 쿼리를 보내도록 결정했습니다.입양 객체에서 mysql 쿼리 출력하기

나는 한 가지를 제외하고는 모두 작동합니다. 내가 너무 많은 것들을 바꾸고 싶지 않았기 때문에 (지금 C++ 빌더를 많이 만들었지 만 지금은 10 년 전이었습니다) 나는 ado 객체를 그대로두고 생성 된 mysql을 출력하려고했습니다. 나는 그것을 웹 서비스에 보낼 수있다. 내가 가진 문제는 내가 찾은 유일한 것은

ShowMessage (DataModuleDB.adoqClients.SQL.Text); 

했다입니다하지만 고뇌에 의해 변경되기 전에이 MySQL의 출력 :

insert into table clients (id, name) values (:id, :name) 

그래서 내 질문은 어떻게 (경우의 수) 내가 할 수 그것을 실행하지 않고 보여줄 "진짜"mysql 쿼리를 얻으십시오.

분명히 내가 그렇게 할 수 없다면 나는 모든 것을 바꾸고 질의를 직접 만들 것이다.

미리 감사드립니다.

답변

3

실제 매개 변수 대체는 VCL 외부에서 발생하며 SQL Server에서 늦게 발생하므로 쿼리 계획을 다시 사용할 수 있습니다.
여전히 대체 SQL이 필요한 경우 ADOQuery의 Command.CommandObject.CommandText을 사용하고 '?' 매개 변수 값을 직접 사용하십시오. 난 단지 TCustomADODataSet``와`TADOQuery`을 변경하는 것이 좋습니다)

type 
    THackADOQuery = class(TADOQuery); 

function DecodeSQL(AADOQuery: TADOQuery): string; 
var 
    curParam: TCollectionItem; 
begin 
    Result := THackADOQuery(AADOQuery).Command.CommandObject.CommandText; 
    for curParam in AADOQuery.Parameters do 
    begin 
    case TParameter(curParam).DataType of 
     ftString, ftWideString: Result := StringReplace(Result, '?', QuotedStr(TParameter(curParam).Value), []); 
     else 
     Result := StringReplace(Result, '?', TParameter(curParam).Value, []); 
    end; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ShowMessage(DecodeSQL(ADOQuery1)); 
    ADOQuery1.ExecSQL; 
end; 
+0

+1, 좋은 편집 :
AFAIK는 ADO는

뭔가처럼 ... 올바른 순서 및 유형에 대한 관심. 그래서 모든 자손에게 적용될 것입니다. – kobik

+0

또한 NULLs, date/time/guid/bool 그리고 데이터베이스에 따라 더 많은 매개 변수 유형을 처리해야합니다 (OP는 MySQL을 사용합니다). IMHO, 모든 공급자를 포괄하는 일반적인 인코딩 기능을 만드는 작업은 그리 간단하지 않습니다 ... – kobik

+0

안녕하세요, 귀하의 의견을 주셔서 대단히 감사합니다! – Iznogood