- PR -

ODP.NETの実行SQLについて

投稿者投稿内容
candide
会議室デビュー日: 2004/05/23
投稿数: 5
投稿日時: 2004-05-23 22:39
はじめまして。
VB.NETの初心者です。

ODP.NETを使用して開発を行っているのですが、下記のようにCommandText
を指定し、パラメータをセットしました。

Dim Cmd As New Oracle.DataAccess.Client.OracleCommand

Cmd.CommandText = "SELECT * FROM TAB WHERE TNAME = :AAA"

Param.ParameterName = "AAA"
Param.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
Param.Value = "test"
Param.Size = 10
Cmd.Parameters.Add(Param)

Read = Cmd.ExecuteReader

SQLの実行は正常に行われ、正しい結果も取得できるのですが
実際に実行されているSQLを確認する方法は有るのでしょうか?

ご存じの方がいらっしゃいましたら、ご回答お願いいたします。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-05-23 23:46
candideさん、こんばんは。

引用:

実際に実行されているSQLを確認する方法は有るのでしょうか?


V$SQLビューで確認できますが、そういう事ではなく?
candide
会議室デビュー日: 2004/05/23
投稿数: 5
投稿日時: 2004-05-23 23:59
きくちゃん 様、ご回答ありがとうございました。

申し訳ありません。私の書き方が悪かったようです。

実行されるSQLを実行せずに確認したいのです。
実行されるSQLを毎回DBを参照して確認するのは大変ですので。

私が投稿しました方法でSQL文を発行する場合は、
どのようなデバック方法があるのでしょうか?

ご存知でしたらご回答いただけますでしょうか?


[ メッセージ編集済み 編集者: candide 編集日時 2004-05-24 00:00 ]

[ メッセージ編集済み 編集者: candide 編集日時 2004-05-24 00:01 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-05-24 01:13
candideさん、こんばんは。

引用:

実行されるSQLを実行せずに確認したいのです。
実行されるSQLを毎回DBを参照して確認するのは大変ですので。


ごめんなさい。何をどうしたいのかが、良く判らないんです...。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-05-24 01:55
NAL-6295です。

例えば・・・

1.トランザクション開始
2.SQL文実行
3.確認したい結果をDataTableに取得
4.ロールバック

じゃ駄目ですかね。

勿論、ロールバックできないSQL文実行しちゃったら駄目ですが・・・。
candide
会議室デビュー日: 2004/05/23
投稿数: 5
投稿日時: 2004-05-24 10:09
皆様ご回答ありがとうございました。
そして私の説明不足で申し訳ありません。

私が行いたいことは、最初に投稿しましたサンプルコードにおいて
※の時点で実行されるSQLをDebug.WriteLineなどで確認したいと言うことです。

Cmd.Parameters.Add(Param)

※ -----この時点

Read = Cmd.ExecuteReader

もしかしてCmd.Parameters.Add()を使用してSQL文にパラメータを追加し、
SQL文を発行しようとした場合、Debug.WriteLineなどを使用しての
確認は不可能なのでしょうか?

度々申し訳ありませんが、ご回答お願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-24 10:18
引用:

candideさんの書き込み (2004-05-23 22:39) より:

SQLの実行は正常に行われ、正しい結果も取得できるのですが
実際に実行されているSQLを確認する方法は有るのでしょうか?


 つまり、「パラメータを展開したSQL文を見たい」ということですか?
SELECT * FROM TAB WHERE TNAME = :AAA

SELECT * FROM TAB WHERE TNAME = test


 一つは、OracleCmmandを継承した、CustomOracleCommandクラスを作って、Executingイベントを追加し、オーバーライドしたExecute系のメソッドで、パラメータ展開したSQL文を引数にしたイベントを発生させる。

 もう一つは、Execute系のメソッドをコールするときに、自前で展開する。


 ですかね。展開については、こんな感じで。
直打ち未検証:
コード:

Dim param As OlacleParameter ' だっけ?
Dim SQL As String = Command.CommandText
For Each param In Command.Parameters
Dim reg As New System.Text.RegularExpressions.Regex(param.ParameterName)
SQL = reg.Replace(SQL, param.Value.ToString)
Next


↑このコードは、SqlCommandと、OracleCommandに対して有効ですが、OleDbCommandには使えません。OleDbCommandでは、プレースホルダに名前を使えない為、正規表現クラスのReplaceメソッドでは、最初のパラメータ値に展開されます。
 OleDbCommandで同じことを行うには、String.IndexOfで、前から"@"の位置を探し、1文字削除して、Value.ToStringを挿入します。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-05-24 10:58 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-05-24 10:46
引用:

Jittaさんの書き込み (2004-05-24 10:18) より:
 つまり、「パラメータを展開したSQL文を見たい」ということですか?
SELECT * FROM TAB WHERE TNAME = :AAA

SELECT * FROM TAB WHERE TNAME = test


あぁ、そういう事なら、V$SQLビューを見る、という私の最初の投稿もNGですね。
"SELECT * FROM TAB WHERE TNAME = :AAA"
のまま格納されているはずですから。

お役に立てず申し訳ありません>candideさん

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