- PR -

パラメータクエリのログの取り方

1
投稿者投稿内容
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2005-12-06 15:31
こんにちは。

Command.ExecuteNonQuery
または
DataAdapter.Update
等で発行した実際のSQLをLogに残したいと考えているのですが、
パラメータクエリにしているので、Command.CommandTextでは
実際のSQLと内容が異なります。

実際発行したSQLを取得するには、どのような方法がありますでしょうか?

環境はVB.Net + IBM DB2です。

初歩的な質問かと思いますが、ご存知の方がいらっしゃいましたらご教授ください。
また、情報の不足や、不備等ございましたらご指摘ください。

よろしくお願いいたします。
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2005-12-06 17:03
私は、DB 回りはバグを作りこんだり、パフォーマンスを測りたいときとかしょっちゅうなので、いつもラッパークラスを経由してアクセスするようにしています。

ラッパークラス経由で、SQL の設定、パラメーター等の設定を行えば、操作の記録を好きなだけログに残せますよ。

ラッパークラスが、ある程度の完成度になるまでは、けっこう大変ですけどね。
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2005-12-06 17:59
ご回答ありがとうございます。

具体的に、以下のような場合、

コード:
        Dim l_conn As New DB2Connection("DATABASE=XXX;UID=XXX;PASSWORD=XXX")
        Dim l_cmd As New DB2Command
        Dim l_txn As DB2Transaction

        l_cmd.Connection = l_conn

        l_cmd.CommandText = "UPDATE TBL_A SET COLUMN_A = ? WHERE COLUMN_B = ?"
        l_cmd.Parameters("COLUMN_A").Value = "AAA"
        l_cmd.Parameters("COLUMN_B").Value = "BBB"

        Try
            l_conn.Open()
            l_txn = l_conn.BeginTransaction(IsolationLevel.ReadUncommitted)
            l_cmd.ExecuteNonQuery()
            l_txn.Commit()
            l_conn.Close()
        Catch ex As Exception
            l_txn.Rollback()
            l_conn.Close()
        End Try



"UPDATE TBL_A SET COLUMN_A = 'AAA' WHERE COLUMN_B = 'BBB'"
という形でSQL文を取得したいのですが、
その方法はないでしょうか?

引用:

わちゃさんの書き込み (2005-12-06 17:03) より:
私は、DB 回りはバグを作りこんだり、パフォーマンスを測りたいときとかしょっちゅうなので、いつもラッパークラスを経由してアクセスするようにしています。

ラッパークラス経由で、SQL の設定、パラメーター等の設定を行えば、操作の記録を好きなだけログに残せますよ。

ラッパークラスが、ある程度の完成度になるまでは、けっこう大変ですけどね。

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2005-12-06 18:24
.Net 側から取得するのはできるのかな

データベースの監査の機能などを使用しないと
そこまで綺麗な SQL は拾えないような気がします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-12-06 18:48
> 実際発行したSQLを取得するには、どのような方法がありますでしょうか?

実際発行したSQLは
コード:
UPDATE TBL_A SET COLUMN_A = ? WHERE COLUMN_B = ?
@COLUMN_A = "AAA"
@COLUMN_B = "BBB"



でしょう。(正確ではない)

データベース内部で

コード:
UPDATE TBL_A SET COLUMN_A = 'AAA' WHERE COLUMN_B = 'BBB'



に置き換えられるのでしょうけど、これをADO.NETで取得する方法はないと思います。
.CommandTextと.Parametersから自力で奇麗なSQL文を生成するしかないでしょう。
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2005-12-06 20:11
みなさま、ご回答ありがとうございます。

todoさん、

引用:

コード:
UPDATE TBL_A SET COLUMN_A = 'AAA' WHERE COLUMN_B = 'BBB'



に置き換えられるのでしょうけど、これをADO.NETで取得する方法はないと思います。
.CommandTextと.Parametersから自力で奇麗なSQL文を生成するしかないでしょう。



やはり方法はないのですね。
自分でSQL文を生成するか、パラメータクエリをやめる方向で考えてみます。
ありがとうございました。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2005-12-06 20:16
本当に生のSQLをログとして取る必要があるのですか?
検索条件のみだったらSQLにする必要はないですよね、

このためにパラメータクエリをやめてしまうのは
もったいないような気がします。
(パフォーマンス的にもセキュリティ的にも)

DB2は使用したことが無いのでわかりませんが、
バインド変数の展開までしてたSQLを調べるための機能はないのですか?
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2005-12-06 20:48
かるあさん、ご回答ありがとうございます。

引用:

本当に生のSQLをログとして取る必要があるのですか?
検索条件のみだったらSQLにする必要はないですよね、


今回作成しているのは社内で使用するツールなのですが、
社内的に、どのようなSQLをいつ・だれが発行したか、
細かくLogを取る規則になっているためなのですが。。。

引用:

このためにパラメータクエリをやめてしまうのは
もったいないような気がします。
(パフォーマンス的にもセキュリティ的にも)


そうですよね、パフォーマンスを考えてパラメータクエリを使用したロジックにしたのに、
Logのためだけにコードを変更するのは本末転倒な気がします。
CommandTextとParameterの羅列でもLogとして認めてもらえるのか、
上司に確認したいと思います。

引用:

DB2は使用したことが無いのでわかりませんが、
バインド変数の展開までしてたSQLを調べるための機能はないのですか?


わたしもこの件はわかりません。
調査してみます。
1

スキルアップ/キャリアアップ(JOB@IT)