バインド変数が設定されたSQL取得について

解決


改善し隊  2010-03-13 01:47:59  No: 38025

1.TSQLQuery.SQL.Add(定数宣言したSQL);
2.TSQLQuery.ParamByName('TEST').AsString := '12345';

といったような記述をしており、open直前くらいにバインド変数が設定されたSQLをテキストに書き出したいと思っています。

TSQLQuery.SQL.Textでは値(上記でいう「12345」)が設定されていませんし、、、

どういった記述にすれば、バインド変数が設定されたSQLを取得することができるのでしょうか?

宜しくお願いします。


Quest  2010-03-13 01:58:04  No: 38026

それは、例えば
TSQLQuery.SQL.Add('SELECT * FROM TABLE1 WHERE KEY1 = :TEST');
TSQLQuery.ParamByName('TEST').AsString := '12345';
としたときに
str := HogeHoge(TSQLQuery);
とかやると
strに SELECT * FROM TABLE1 WHERE KEY1 = '12345' が代入される
HogeHoge関数が無いかということでしょうか?
多分、無いんじゃないかと思いますが。


改善し隊  2010-03-13 04:03:13  No: 38027

Quest様

やはり関数で簡単にやる方法は無いんですね。。。

とすると、実現方法としては1つ1つ文字列置換するしかないんですよね。

ちなみに、TSQLQueryしか持っていない関数内で1つ1つ置換する方法
(「:TEST」と「12345」を取得する方法)ってありますか?

TSQLQueryのプロパティとか見てもよくわからなかったもので。。
params辺りでしょうか・・・?


Quest  2010-03-13 07:01:40  No: 38028

うーん、何を求めているのか良く分からないのですが
パラメータの名前とその値の一覧がほしいのでしょうか?
それとも、最終的にデータベースに投げられるSQL文の
全容を知りたいのでしょうか。
後者であれば、データベースによっては実行されたSQLのログを
取り出せるものもあるようです。

また、前者であれば
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  s: string;
begin
  SQLQuery1.SQL.Text := 'SELECT * FROM TEST1 WHERE KEY1=:DATA1 AND KEY2=:DATA2';
  SQLQuery1.ParamByName('DATA1').AsInteger := 123;
  SQLQuery1.ParamByName('DATA2').AsDateTime := Now;
  for i := 0 to Pred(SQLQuery1.Params.Count) do
  begin
    s := SQLQuery1.Params[i].Name + ' = ' + VarToStr(SQLQuery1.Params[i].Value);
    Memo1.Lines.Add(s);
  end;
end;
こんな事をすれば、一応はパラメータリストを取得できます。


改善し隊  2010-03-15 20:00:02  No: 38029

Quest様

教えて頂いた方法でパラメータリストが取得できることを確認しました!
(説明が下手な中、考えを汲み取って頂いて感謝しております。)

後はこれを料理すればイロイロできますね。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加