2009-12-10 3 views
74

Возможно ли захватить вывод печати из хранимой процедуры TSQL в .NET?Захват сохраненной процедуры вывода вывода на печать в .NET

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

Это может быть не только об ошибках. Я попытаюсь использовать это, чтобы отслеживать прогресс длительной хранимой процедуры, наблюдая за информативным выходом. –

ответ

114

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

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage); 

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e) 
{ 
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message); 
} 
+4

Если вы также хотите, чтобы строки были затронуты, вам нужен обработчик события StatementCompleted в SqlCommand. – Nicholas

+0

@ Николас вы можете уточнить? Я не могу заставить это событие работать правильно. См. Http://stackoverflow.com/questions/27993049/retrieve-record-counts-from-multiple-statements –

+0

Вы поймаете все сообщения, созданные на сервере sql с этим событием? Возможно ли, что это событие также поймает некоторые другие сообщения, не созданные этой хранимой процедурой? – FrenkyB

5

Это очень удобно, если вы хотите, чтобы захватить вывод на печать в консоли вывода LINQPad в:

SqlConnection conn = new SqlConnection(ConnectionString); 
//anonymous function to dump print statements to output console 
conn.InfoMessage += (object obj, SqlInfoMessageEventArgs e)=>{ 
       e.Message.Dump(); 
      };