2011-12-21 4 views
1

私は、仕事中にここでdelphiプログラムが何をするのか変更することを任されています。アプリケーションはあまりにもmysqlサーバに接続し、ADOでクエリを実行していました。サーバーが外部接続を受け付けないように変更されたので、アプリケーションをWebサービスに接続してそこからmysql更新クエリを送信することにしました。ADOオブジェクトからmysqlクエリを出力する

私は一つのことを除いてすべてが働いています。私はあまりにも多くのものを変更したくないので(私は多くのC++ビルダーを戻しましたが、10年前に戻ってきました)、私はadoオブジェクトをそのまま残して、それが生成するmysqlを出力しようとしました私はそれをWebサービスに送ることができます(私は意味があることを望みます)。 私が持っている問題は、私が見つけた唯一のことは、

ShowMessage (DataModuleDB.adoqClients.SQL.Text); 

たです。しかし、それは、ADOによって変更される前に、これはMySQLを出力します

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

だから私の質問ですがどのように(もしその可能性)私ができました"本物の" mysqlクエリを実行せずに表示させる。

私がそれを好きではない場合は、明らかにすべてを変更し、自分でクエリを構築します。

ありがとうございます。

答えて

3

実際のパラメータの置換は、VCLの外部で行われており、SQL Server自体の遅れで行われています(クエリプランの再利用が可能)。
置換されたSQLがまだ必要な場合は、ADOQueryのCommand.CommandObject.CommandTextを使用して、 '?'あなた自身のパラメータ値で。
は私の知る限り、ADOはだけのような

何か...右の順序とタイプをケア:

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、素敵な編集;)私は 'TCustomADODataSet'と' TADOQuery'を変更することをお勧めします。すべての子孫に適用されます。 – kobik

+0

さらに、NULL、日付/時刻/ guid/bool、データベースの種類によっては多分もっと多くのパラメータ型を扱う必要があります(OPは 'MySQL'を使います)。 IMHO、すべてのプロバイダをカバーする汎用のエンコード関数を作成する作業はそれほど単純ではありません。 – kobik

+0

あなたのご入力いただきありがとうございました! – Iznogood

関連する問題