จับภาพผลลัพธ์การพิมพ์ Stored Procedure ใน. NET


97

เป็นไปได้หรือไม่ที่จะจับภาพเอาต์พุตการพิมพ์จากโพรซีเดอร์ที่จัดเก็บ T-SQL ใน. NET

ฉันมีพร็อคดั้งเดิมจำนวนมากที่ใช้การพิมพ์เป็นวิธีการส่งข้อความผิดพลาด ตัวอย่างเป็นไปได้หรือไม่ที่จะเข้าถึง 'word' จากการทำตาม 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 = ???

4
อาจไม่เพียง แต่เกี่ยวกับข้อผิดพลาด ฉันจะพยายามใช้สิ่งนี้เพื่อติดตามความคืบหน้าของ proc ที่จัดเก็บไว้เป็นเวลานานโดยดูผลลัพธ์ที่ให้ข้อมูล
Csaba Toth

คำตอบ:


143

คุณสามารถทำได้โดยการเพิ่มตัวจัดการเหตุการณ์ในเหตุการณ์InfoMessageบนการเชื่อมต่อ

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

5
หากคุณต้องการให้แถวที่ได้รับผลกระทบนับคุณต้องมีตัวจัดการสำหรับเหตุการณ์ StatementCompleted บน SqlCommand
Nicholas

@ นิโคลัสละเอียดได้มั้ย? ฉันไม่สามารถทำให้เหตุการณ์นั้นทำงานได้อย่างถูกต้อง โปรดดูstackoverflow.com/questions/27993049/…
Mr. TA

คุณจับข้อความทั้งหมดที่สร้างภายในเซิร์ฟเวอร์ sql ด้วยเหตุการณ์นั้นหรือไม่? เป็นไปได้หรือไม่ที่เหตุการณ์นี้จะจับข้อความอื่น ๆ ที่ไม่ได้สร้างขึ้นโดยขั้นตอนการจัดเก็บนั้น?
FrenkyB

สิ่งนี้อาจชัดเจน แต่ถ้าไม่มีเอาต์พุตจาก proc (ไม่มีการพิมพ์การเพิ่มความผิดพลาด ฯลฯ ) เหตุการณ์นั้นจะไม่ถูกทริกเกอร์ สิ่งนี้ทำให้ฉันนิ่งงันไปชั่วขณะจนกระทั่งฉันตระหนักว่าเกิดอะไรขึ้น
IronRod

@FrenkyB ฉันยืนยันได้ว่าจะจับเอาท์พุททั้งหมด (พิมพ์, raiserror ฯลฯ ) จาก proc ที่เรียกใช้หรือ procs หรือฟังก์ชั่นใด ๆ ที่เรียกใช้
IronRod

9

สิ่งนี้มีประโยชน์มากหากคุณต้องการจับภาพพิมพ์ในคอนโซลเอาต์พุตของ LinqPad:

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

1

ในการรับผลลัพธ์เป็นตัวแปร:

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.