Capture Stored Procedure hasil cetak dalam .NET

97

Apakah mungkin untuk menangkap keluaran cetak dari prosedur tersimpan T-SQL di .NET?

Saya memiliki banyak procs warisan yang menggunakan cetakan sebagai alat pesan kesalahan. Sebuah contoh, apakah mungkin untuk mengakses outprint 'word' dari mengikuti 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
sumber
4
Ini mungkin bukan hanya tentang kesalahan. Saya akan mencoba menggunakan ini untuk melacak kemajuan proc yang disimpan lama berjalan dengan menonton output informatif.
Csaba Toth

Jawaban:

143

Anda dapat melakukan ini dengan menambahkan event handler ke event InfoMessage pada koneksi.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}
AdaTheDev
sumber
5
Jika Anda juga ingin baris terpengaruh menghitung maka Anda memerlukan penangan untuk acara StatementCompleted di SqlCommand.
Nicholas
@Nicholas, bisakah Anda menjelaskan? Saya tidak bisa membuat acara itu berfungsi dengan baik. Silakan lihat stackoverflow.com/questions/27993049/…
Tn. TA
Apakah Anda menangkap semua pesan yang dihasilkan dalam sql server dengan acara itu? Mungkinkah acara ini juga akan menangkap beberapa pesan lain, tidak dihasilkan oleh prosedur yang tersimpan itu?
FrenkyB
Ini mungkin jelas tetapi jika tidak ada output dari proc (tidak ada print, raiseerror, dll.) Maka acara tersebut tidak dipicu. Ini membuat saya bingung untuk beberapa saat sampai saya menyadari apa yang terjadi.
IronRod
@FrenkyB Saya dapat mengonfirmasi bahwa itu akan menangkap semua output (cetak, raiserror, dll.) Dari proc yang dipanggil atau procs atau fungsi apa pun yang dipanggilnya.
IronRod
9

Ini sangat berguna jika Anda ingin menangkap keluaran Print di konsol keluaran 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
sumber
1

Untuk mendapatkan output menjadi variabel:

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
sumber