.NET에서 저장 프로 시저 인쇄 출력 캡처


97

.NET의 T-SQL 저장 프로 시저에서 인쇄 출력을 캡처 할 수 있습니까?

인쇄를 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
오류에 관한 것만이 아닙니다. 유익한 출력을 보면서 장기 실행 저장 프로 시저의 진행 상황을 추적하기 위해 이것을 사용하려고합니다.
Csaba Toth

답변:


143

연결시 InfoMessage 이벤트에 이벤트 처리기를 추가하여이를 수행 할 수 있습니다 .

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

5
영향을받는 행 수를 원하는 경우 SqlCommand의 StatementCompleted 이벤트에 대한 처리기가 필요합니다.
Nicholas

@Nicholas 자세히 설명해 주시겠습니까? 해당 이벤트가 제대로 작동하지 않습니다. 참조하시기 바랍니다 stackoverflow.com/questions/27993049/...
씨 TA

해당 이벤트와 함께 SQL Server 내에서 생성 된 모든 메시지를 포착하고 있습니까? 이 이벤트가 해당 저장 프로 시저에 의해 생성되지 않은 다른 메시지도 포착 할 수 있습니까?
FrenkyB

이것은 명백 할 수 있지만 proc에서 출력이 없으면 (인쇄 없음, raiseerror 등) 이벤트가 트리거되지 않습니다. 이것이 무슨 일이 일어나고 있는지 깨달을 때까지 잠시 나를 어리둥절하게 만들었습니다.
IronRod

@FrenkyB 호출 된 proc 또는 호출하는 모든 procs 또는 함수에서 모든 출력 (인쇄, raiserror 등)을 캡처 할 것임을 확인할 수 있습니다.
IronRod

9

LinqPad의 출력 콘솔에서 Print 출력을 캡처하려는 경우 매우 편리합니다.

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.