114 votes

Capture de la sortie d'impression de la procédure stockée en .NET

Est-il possible de capturer la sortie imprimée d'une procédure stockée T-SQL en .NET ?

J'ai beaucoup d'anciennes procédures qui utilisent l'impression comme moyen de notification des erreurs. Par exemple, est-il possible d'accéder à l'impression 'word' à partir du PROC suivant ?

-- 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 = ???

6 votes

Il ne s'agit peut-être pas seulement d'erreurs. Je vais essayer de l'utiliser pour suivre la progression d'une procédure stockée longuement exécutée en observant la sortie informative.

163voto

AdaTheDev Points 53358

Pour ce faire, il suffit d'ajouter un gestionnaire d'événements à l'option InfoMessage sur la connexion.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

7 votes

Si vous voulez également que les lignes affectées soient comptées, vous avez besoin d'un gestionnaire pour l'événement StatementCompleted sur la SqlCommand.

0 votes

@Nicholas pouvez-vous développer ? Je n'arrive pas à faire fonctionner cet événement correctement. Veuillez consulter stackoverflow.com/questions/27993049/

0 votes

Est-ce que vous attrapez tous les messages produits dans le serveur sql avec cet événement ? Est-il possible que cet événement attrape également d'autres messages, qui ne sont pas produits par cette procédure stockée ?

11voto

BraveNewMath Points 1306

C'est vraiment pratique si vous voulez capturer la sortie Print dans la console de sortie 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();
            };

6voto

Keith Points 5138

Pour obtenir la sortie dans une 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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X