- - PR -
SqlConnection.InfoMessage イベント について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 |
|
投稿日時: 2005-03-01 01:08
南部です。
DBCC INDEXDEFRAG(Northwind,Products,PK_Products)の 結果セットを取得した状態で処理を終了しています。 //ストアド実行 sqlReader = cmd.ExecuteReader(); sqlReader.NextResult(); //これを追加 でどうですか。 |
|
投稿日時: 2005-03-01 15:33
>南部様
さっそく試してみた結果、正常にイベントを取得できました!! MSDNでSqlDataReader.NextResultについて 読んでみましたが、 DBCC INDEXDEFRAGが複数の結果を返しているために SqlDataReader.NextResult()の追記が必要なんだと理解しました。 ありがとうございました。 |
1