Сохранение вывода на печать сохраненной процедуры в .NET

97

Можно ли получить вывод на печать из хранимой процедуры T-SQL в .NET?

У меня есть много устаревших процедур, которые используют печать как средство сообщения об ошибках. Например, можно ли получить доступ к "слову" вывода из следующего 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

Ответы:

143

Вы можете сделать это, добавив обработчик событий к событию InfoMessage в соединении.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}
AdaTheDev
источник
5
Если вы также хотите, чтобы затронутые строки были подсчитаны, вам понадобится обработчик для события StatementCompleted в SqlCommand.
Николас
@ Николас, ты можешь уточнить? Я не могу заставить это мероприятие работать должным образом. См. Stackoverflow.com/questions/27993049/…
Г-н Т.А.
Вы перехватываете все сообщения, созданные на сервере sql с этим событием? Возможно ли, что это событие также перехватит некоторые другие сообщения, не созданные этой хранимой процедурой?
FrenkyB
Это может быть очевидно, но если нет вывода из процедуры (нет печати, ошибки повышения и т. Д.), То событие не запускается. Это озадачило меня на время, пока я не понял, что происходит.
IronRod 03
@FrenkyB Я могу подтвердить, что он захватит весь вывод (print, raiserror и т. Д.) Из вызванной процедуры или любых процедур или функций, которые он вызывает.
IronRod 03
9

Это действительно удобно, если вы хотите захватить вывод Print в консоли вывода 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);
Кит
источник