.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.