Захоплення вихідних даних друку збереженої процедури в .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.
Микола

@Nicholas, ти можеш пояснити? Я не можу змусити цю подію працювати належним чином. Будь ласка, дивіться stackoverflow.com/questions/27993049/…
пан ТА

Ви ловите всі повідомлення, створені на сервері sql з цією подією? Чи можливо, що ця подія також охопить деякі інші повідомлення, не створені цією збереженою процедурою?
FrenkyB

Це може бути очевидним, але якщо немає результатів із proc (немає друку, помилки піднімання тощо), то подія не запускається. Це на деякий час мене тупило, поки я не зрозумів, що відбувається.
IronRod

@FrenkyB Я можу підтвердити, що він буде фіксувати всі вихідні дані (друк, помилка піднімання тощо) із викликаного proc або будь-яких процедур або функцій, які він викликає.
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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.