.NETでのストアドプロシージャ印刷出力のキャプチャ


97

.NETのT-SQLストアドプロシージャから印刷出力をキャプチャすることは可能ですか?

errorMessagingの手段として印刷を使用する多くのレガシープロシージャがあります。例、次のPROCからアウトプリントの「単語」にアクセスすることは可能ですか?

-- The PROC
CREATE PROC usp_PrintWord AS
    PRINT 'word'
// Some C# Code to would like to pull out 'word'
SqlCommand cmd = new SqlCommand("usp_printWord", TheConnection);
cmd.CommandType = CommandType.StoredProcedure;
// string ProcPrint = ???

4
エラーだけではないかもしれません。これを使用して、有益な出力を監視することで、長時間実行されるストアドプロシージャの進行状況を追跡します。
Csaba Toth 2013

回答:


143

これを行うには、接続のInfoMessageイベントにイベントハンドラーを追加します。

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}

5
影響を受ける行数も必要な場合は、SqlCommandのStatementCompletedイベントのハンドラーが必要です。
ニコラス

@ニコラスは詳しく説明できますか?そのイベントを正しく機能させることができません。stackoverflow.com/questions/27993049/…を
TA氏

SQLサーバー内で生成されたすべてのメッセージをそのイベントでキャッチしていますか?このイベントが、そのストアドプロシージャによって生成されない他のいくつかのメッセージもキャッチすることは可能ですか?
FrenkyB 2015年

これは明白かもしれませんが、プロシージャからの出力がない(印刷、raiseerrorなどがない)場合、イベントはトリガーされません。何が起こっているのか気づくまで、これはしばらく私を困らせました。
IronRod

@FrenkyB呼び出されたプロシージャまたはそれが呼び出すすべてのプロシージャまたは関数からのすべての出力(印刷、レイサーなど)をキャプチャすることを確認できます。
IronRod

9

これは、LinqPadの出力コンソールで印刷出力をキャプチャする場合に非常に便利です。

SqlConnection conn = new SqlConnection(ConnectionString);
//anonymous function to dump print statements to output console
conn.InfoMessage += (object obj, SqlInfoMessageEventArgs e)=>{
                e.Message.Dump();
            };

1

出力を変数に入れるには:

string printOutput = "";

using (var conn = new SqlConnection(...))
{
    // handle this event to receive the print output
    conn.InfoMessage += (object obj, SqlInfoMessageEventArgs e) => {
        printOutput += e.Message;
    };

    // execute command, etc.
}

Console.Write(printOutput);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.