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