- PR -

SqlParameterを使用したSQLから実際に出力されるSOL文を取得したい。

1
投稿者投稿内容
れいずん
会議室デビュー日: 2005/11/11
投稿数: 15
投稿日時: 2006-08-17 11:21
実際にSQLServerに発行されたSQL文を取得し、ログに出力したいのですが、自作ではなく、ADO.NET機能にないのでしょうか?
MSDNなどで調べたのですが、見つけきれませんでした。

OS Windos XP Pro
言語 .NET1.1 C#
DB : SQLServer2000
IDE : VS2003

A : "SELECT * FROM TEST1 WHERE T_INT = @T_INT"
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
B : "SELECT * FROM TEST1 WHERE T_INT = 12345789"

AをSqlCommandにセットし、SQL発行前もしくは後にBを取得したいです。

下記にソースを記載します。(データの取得等はできています。)
コメントアウトの1もしくは2で取得したいです。

public SqlDataReader ExecuteReaderParameter()
{
conn.Open();
SqlCommand cmd = null;
cmd = new SqlCommand(
"SELECT * FROM TEST1 WHERE T_INT = @T_INT", conn);
SqlParameter param = new SqlParameter("@T_INT", 12345789);
cmd.Parameters.Add(param);
SqlCommandBuilder b = new SqlCommandBuilder();
/** 1 **/
SqlDataReader reader = cmd.ExecuteReader();
/** 2 **/
conn.Close();
return reader;

}

参考になるサイトだけでもかまいません。

よろしくお願いします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-08-17 11:50
ADO.NETの機能としてはないと思います。
SQL Server側のログ等で確認するのが一般的なのかな?
THREE-ONE
常連さん
会議室デビュー日: 2006/08/17
投稿数: 36
投稿日時: 2006-08-17 11:53
こんにちは

そもそも、SqlParameter を使用した場合、れいずんさんの示されているBのような形の SQL が SQLServer に渡されるわけではなかったと思います。
たしか
SELECT * FROM TEST1 WHERE T_INT = @T_INT, @T_INT=12345789
のような形で渡されたと思います。
SQLServer の profiler などで確認してみてはいかがですか?
れいずん
会議室デビュー日: 2005/11/11
投稿数: 15
投稿日時: 2006-08-17 12:13
早速の返信ありがとうございます。

THREE-ONE様>確認した結果、下記が発行されていました。
exec sp_executesql N'SELECT * FROM TEST1 WHERE T_INT = @T_INT', N'@T_INT int', @T_INT = 12345789
これをソース上で取得できれば十分(お客さんにも納得してもらえるかと)だとおもうのですが、取得はできないのでしょうか?
いま自分のほうでも取れないか調べていますが、教えていただけるとありがたいです。


どっとねっとふぁん様>説明不足ですいません。現在log4netを使用してログ出力をしているのですが、そのログに発行SQLを出力させたいと考えています。


[ メッセージ編集済み 編集者: れいずん 編集日時 2006-08-17 12:14 ]
THREE-ONE
常連さん
会議室デビュー日: 2006/08/17
投稿数: 36
投稿日時: 2006-08-17 13:32
それは無理だと思います。
どうしてもロギングしたければ、CommandText と SqlParameter から自作するような
ロジックを組み込む必要があると思います。
パラメータ込みのSQL文と、各パラメータの名前・値の羅列ではお客様に納得してもらえないのでしょうか?
れいずん
会議室デビュー日: 2005/11/11
投稿数: 15
投稿日時: 2006-08-17 14:09
早速の返信ありがとうございます。

THREE-ONE様>

>それは無理だと思います。
自分でも調べてみましたが無理そうですね。

>どうしてもロギングしたければ、CommandText と SqlParameter から自作するような
>ロジックを組み込む必要があると思います。
そうですね。自作で作ることにします。

>パラメータ込みのSQL文と、各パラメータの名前・値の羅列ではお客様に納得してもらえ
>ないのでしょうか?
多分大丈夫だと思うので提案してみます。

とりあえず解決ということで、THREE-ONE様、どっとねっとふぁん様 ありがとうございました。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-17 23:34
 データベースのオープンは非常に高価なため、もっと局所的に行うことが推奨されています。
コード:
public SqlDataReader ExecuteReaderParameter()
{
	// 移動 conn.Open();
	SqlCommand cmd = null;
	cmd = new SqlCommand(
		"SELECT * FROM TEST1 WHERE T_INT = @T_INT", conn);
	SqlParameter param = new SqlParameter("@T_INT", 12345789);
	cmd.Parameters.Add(param);
	SqlCommandBuilder b = new SqlCommandBuilder();
	SqlDataReader reader = null;
	/** 1 **/
	try {
		conn.Open();
		reader = cmd.ExecuteReader();
		/** 2 **/
	} finally {
		// 閉じることを保証する
		conn.Close();
	}
	return reader; // あれ???
}


うん?接続を閉じたら、reader も閉じるような???


本題の方ですが、私は自力で作っています。
コード:
string paramForLogString(SqlCommand command)
{
	string retValue = command.CommandText;
	foreach (SqlParameter param in command.Parameters) {
		retValue = retValue.Replace(param.ParameterName, param.Value.ToString());
	}
	return retValue;
}

1

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