.NET'te Depolanan Prosedür yazdırma çıktısını yakalayın


97

.NET'te bir T-SQL saklı yordamından çıktı almak mümkün müdür?

Yazdırmayı errorMessaging aracı olarak kullanan birçok eski işlemim var. Örnek olarak, PROC'yi takip eden çıkış 'kelimesine' erişmek mümkün mü?

-- 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
Belki sadece hatalarla ilgili değil. Bilgilendirici çıktıyı izleyerek uzun süredir depolanan bir işlemin ilerlemesini takip etmek için bunu kullanmaya çalışacağım.
Csaba Toth

Yanıtlar:


143

Bunu , bağlantıdaki InfoMessage olayına bir olay işleyicisi ekleyerek yapabilirsiniz .

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

5
Etkilenen satırların sayımını da istiyorsanız, SqlCommand'da StatementCompleted olayı için bir işleyiciye ihtiyacınız vardır.
Nicholas

@Nicholas detaylandırabilir misin? O olayın düzgün çalışmasını sağlayamıyorum. Lütfen stackoverflow.com/questions/27993049/…
Bay TA

O olay ile sql server içerisinde üretilen tüm mesajları yakalıyor musunuz? Bu olayın, bu saklı yordam tarafından üretilmeyen diğer bazı iletileri de yakalaması mümkün müdür?
FrenkyB

Bu açık olabilir, ancak proc'tan herhangi bir çıktı yoksa (yazdırma, yükseltme hatası, vb.) Olay tetiklenmez. Neler olduğunu anlayana kadar bu beni bir süre şaşırttı.
IronRod

@FrenkyB Çağrılan işlemden veya çağırdığı herhangi bir işlemden veya işlevden gelen tüm çıktıları (yazdırma, yükseltme hatası vb.) Yakalayacağını onaylayabilirim.
IronRod

9

LinqPad'in çıktı konsolunda Baskı çıktısını yakalamak istiyorsanız bu gerçekten kullanışlıdır:

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

1

Çıkışı bir değişkene almak için:

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.