SqlDataSource や ObjectDataSource などで実際に発行されたSQL(パラメータ値を含む)
を取得するにはどのようにしたらよいでしょうか。DBにはOracleを使用しています。
・試したこと
SqlDataSource の Updated イベントで「e.Command.CommandText.ToString()」。
これで取得できたのは「… WHERE PARAM1 = :PARAM1」 のようにパラメータ名でした。
取得したいのは「… WHERE PARAM1 = 1101」のようにパラーメータ値を含むSQLです。
ORACLEにSQLのログをはかせれば、実際発行したSQL
そのものが分かると思います。
環境設定は良く分からないので、これでよいのかどうか不明ですが
ORACLEで発行したSQLのログをはかせることは可能です。
http://www.atmarkit.co.jp/fsecurity/rensai/dbsec05/dbsec01.html
--------------------------
プログラム上で、パラメータクエリを発行して、実際に発行したSQLを取得する方法は、なかったと思います。
「select * from V$SQL」とすることで最近実行したSQLを取得することが出来ます。(systemユーザーなどで無いと参照できないかも)
ただし、パラメータに関しては 「… WHERE PARAM1 = 1101」ではなく、「… WHERE PARAM1 = :1」等として表示されます。あくまでも、パラメータはパラメータのまま扱われ、途中の段階でSQL文字列に展開されるわけではないからです。
どうしてもパラメータを展開した形でSQLが必要なら、自身で「:PARAM1」を「1101」等に置き換える処理を書かねばなりません。
ちなみに、Oracle内部で「… WHERE PARAM1 = :PARAM1」を「:PARAM1 = 1101」で実行するのと「… WHERE PARAM1 = 1101」は別のSQLとして扱われます。実行計画(内部でSQLをどう解釈するか)もおそらく変化し、実行時間も変わる可能性があります。
http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/index.html
コメント(0件)