Сохранение вывода на печать сохраненной процедуры в .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);
}

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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.