Capturar salida de impresión de procedimiento almacenado en .NET

97

¿Es posible capturar la salida de impresión de un procedimiento almacenado de T-SQL en .NET?

Tengo muchos procesos heredados que usan la impresión como medio de mensajería de error. Un ejemplo, ¿es posible acceder a la 'palabra' impresa desde el siguiente 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 = ???
Pedro
fuente
4
Quizás no solo se trate de errores. Intentaré usar esto para realizar un seguimiento del progreso de un proceso almacenado de larga ejecución observando la salida informativa.
Csaba Toth

Respuestas:

143

Puede hacer esto agregando un controlador de eventos al evento InfoMessage en la conexión.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}
AdaTheDev
fuente
5
Si también desea que las filas afectadas cuenten, entonces necesita un controlador para el evento StatementCompleted en SqlCommand.
Nicholas
@Nicholas, ¿puedes dar más detalles? No puedo hacer que ese evento funcione correctamente. Consulte stackoverflow.com/questions/27993049/…
Sr. TA
¿Está captando todos los mensajes producidos dentro del servidor SQL con ese evento? ¿Es posible que este evento también capture algunos otros mensajes, no producidos por ese procedimiento almacenado?
FrenkyB
Esto puede ser obvio, pero si no hay salida del proceso (sin impresión, aumento de error, etc.), el evento no se activa. Esto me dejó perplejo por un tiempo hasta que me di cuenta de lo que estaba sucediendo.
IronRod
@FrenkyB Puedo confirmar que capturará toda la salida (print, raiserror, etc.) del proceso invocado o cualquier proceso o función que llame.
IronRod
9

Esto es realmente útil si desea capturar la salida de impresión en la consola de salida de LinqPad:

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

Para convertir la salida en una variable:

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);
Keith
fuente