@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

SqlConnection.InfoMessage イベント について

1
投稿者投稿内容
りう。
会議室デビュー日: 2005/02/24
投稿数: 6
投稿日時: 2005-02-28 18:34
はじめまして。
WindowsXP Pro + SQLServer2000で開発を行っています。
.NET側かSQLServer側の問題かはっきりわからないのですが、
ご教授いただきたく、書き込みいたします。

C#のコンソールアプリケーションDBのデータ断片化解消を実行するからストアドを呼び出すようにし、ストアドでPRINT命令を発行してその内容をログとしてテキストに出力しようとしています。
しらべたところSqlConnection.InfoMessage イベント が発生するのでそのイベントを
SqlInfoMessageEventHandler デリゲート を用意して受け取れば良いということで、
下記のようなソース(テストのため処理を簡略化しています)を用意して試してみたところ、「DBCC INDEXDEFRAG」を実行した後のPRINT文での出力がうけとれません。

SQLの実行が途中で途切れているのかともおもいましたが、
最後にINSERT文を追加して実行してみてもデータが増えていて実行されていることが
確認できました。
クエリアナライザで実行したところ出力は最後まで出ます。
どこに問題あるのかが検討がつかずいきづまってしまいました。

ちょっとしたヒントでも良いのでご教授よろしくお願いいたします。

//C#ソース
class TEST_STORED
{
[STAThread]
static void Main(string[] args)
{
//DB接続クラス初期化
SqlConnection sqlcn = new SqlConnection();

try
{

//接続文字列初期化
sqlcn.ConnectionString = "Server=[SERVE_NAME];UID=[USER_ID];PWD=[PASS_WORD];Database=Northwind";

//コネクション確立
sqlcn.Open();

//SqlInfoMessageEventHandler初期化
sqlcn.InfoMessage += new sqlInfoMessageEventHandler(OnInfoMessage);

//コマンドオブジェクト初期化
SqlCommand cmd = new SqlCommand("TEST_STORED",sqlcn);

//コマンドタイプ初期化
cmd.CommandType = CommandType.StoredProcedure;

//コマンドタイムアウト設定
cmd.CommandTimeout = 3600;

//SqlDataReader初期化
SqlDataReader sqlReader;

//ストアド実行
sqlReader = cmd.ExecuteReader();
}
catch(Exception e)
{
Console.Write(e.Message);
}
finally
{
//DB切断
sqlcn.Close();
}
}

//SqlInfoMessageイベントハンドラー(ここでPRINT文の出力をひろう)
static void OnInfoMessage(object sender, SqlInfoMessageEventArgs args)
{
/* PRINTコマンドのメッセージを表示 */
Console.Write(args.Message);
}
}

--ストアド
ALTER PROCEDURE dbo.TEST_STORED
AS
PRINT 'RPINT 1'
PRINT 'RPINT 2'
PRINT 'RPINT 3'
DBCC INDEXDEFRAG(Northwind,Products,PK_Products)
PRINT 'RPINT 4'
PRINT 'RPINT 5'
PRINT 'RPINT 6'
--※ここでINSERT文を入れても実行される。
GO
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2005-03-01 01:08
南部です。

DBCC INDEXDEFRAG(Northwind,Products,PK_Products)の
結果セットを取得した状態で処理を終了しています。

//ストアド実行
sqlReader = cmd.ExecuteReader();
sqlReader.NextResult(); //これを追加

でどうですか。
りう。
会議室デビュー日: 2005/02/24
投稿数: 6
投稿日時: 2005-03-01 15:33
>南部様

さっそく試してみた結果、正常にイベントを取得できました!!
MSDNでSqlDataReader.NextResultについて
読んでみましたが、

DBCC INDEXDEFRAGが複数の結果を返しているために
SqlDataReader.NextResult()の追記が必要なんだと理解しました。

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

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