Capturer la sortie d'impression de la procédure stockée dans .NET

97

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

J'ai beaucoup de processus hérités qui utilisent l'impression comme moyen de message d'erreur. Un exemple, est-il possible d'accéder au mot «mot» de l'empreinte en suivant 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 = ???
Peter
la source
4
Ce n'est peut-être pas seulement une question d'erreurs. Je vais essayer de l'utiliser pour suivre la progression d'un processus stocké de longue durée en regardant la sortie informative.
Csaba Toth

Réponses:

143

Vous pouvez le faire en ajoutant un gestionnaire d'événements à l' événement InfoMessage sur la connexion.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}
AdaTheDev
la source
5
Si vous souhaitez également que les lignes affectées comptent, vous avez besoin d'un gestionnaire pour l'événement StatementCompleted sur le SqlCommand.
Nicholas
@Nicholas pouvez-vous élaborer? Je n'arrive pas à faire fonctionner correctement cet événement. Veuillez consulter stackoverflow.com/questions/27993049/…
Mr. TA
Attrapez-vous tous les messages produits dans le serveur SQL avec cet événement? Est-il possible que cet événement intercepte également certains autres messages, non produits par cette procédure stockée?
FrenkyB
Cela peut être évident, mais s'il n'y a pas de sortie du proc (pas d'impression, erreur de montée, etc.) alors l'événement n'est pas déclenché. Cela m'a déconcerté pendant un moment jusqu'à ce que je réalise ce qui se passait.
IronRod
@FrenkyB Je peux confirmer qu'il capturera toute la sortie (print, raiserror, etc.) à partir du proc appelé ou de tout procs ou fonction qu'il appelle.
IronRod
9

Ceci est vraiment pratique si vous souhaitez capturer la sortie d'impression 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();
            };
BraveNewMath
la source
1

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);
Keith
la source