Đầu ra in Thủ tục đã Lưu trữ trong .NET


97

Có thể chụp đầu ra in từ một thủ tục được lưu trữ T-SQL trong .NET không?

Tôi có rất nhiều procs kế thừa sử dụng bản in làm phương tiện thông báo lỗi. Một ví dụ, có thể truy cập 'từ' outprint từ sau PROC không?

-- 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
Nó có thể không chỉ về lỗi. Tôi sẽ cố gắng sử dụng điều này để theo dõi tiến trình của một proc được lưu trữ lâu dài bằng cách xem kết quả cung cấp thông tin.
Csaba Toth

Câu trả lời:


143

Bạn có thể thực hiện việc này bằng cách thêm trình xử lý sự kiện vào sự kiện InfoMessage trên kết nối.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

5
Nếu bạn cũng muốn số hàng bị ảnh hưởng thì bạn cần một trình xử lý cho sự kiện StatementCompleted trên SqlCommand.
Nicholas

@Nicholas bạn có thể nói rõ hơn không? Tôi không thể làm cho sự kiện đó hoạt động bình thường. Vui lòng xem stackoverflow.com/questions/27993049/…
Mr. TA

Bạn có bắt được tất cả các thư được tạo trong máy chủ sql với sự kiện đó không? Có thể sự kiện này cũng sẽ bắt một số thông báo khác, không được tạo ra bởi thủ tục lưu trữ đó?
FrenkyB

Điều này có thể hiển nhiên nhưng nếu không có đầu ra từ proc (không có bản in, lỗi nâng, v.v.) thì sự kiện không được kích hoạt. Điều này khiến tôi bối rối trong một thời gian cho đến khi tôi nhận ra điều gì đang xảy ra.
IronRod

@FrenkyB Tôi có thể xác nhận rằng nó sẽ nắm bắt tất cả đầu ra (in, raiserror, v.v.) từ proc được gọi hoặc bất kỳ procs hoặc chức năng nào mà nó gọi.
IronRod

9

Điều này thực sự tiện dụng nếu bạn muốn ghi lại đầu ra In trong bảng điều khiển đầu ra của 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

Để nhận đầu ra thành một biến:

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.