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