如何捕获从 SQL Server 的消息选项卡到 C# 应用程序的所有内容?

我的应用程序的一些背景。

我正在使用C#开发File Watcher Windows 服务,该服务在特定文件夹中查找.bak文件,然后使用它来恢复该文件所属的数据库。


恢复的数据库有一个存储过程,它调用 10 个不同的存储过程。在还原完成后执行存储过程是文件观察器的功能。


存储过程是[1_IMPORT_DATA_AND_PROCESS_ALL]在其自身内部调用 10 个不同的存储过程。


这是还原完成后正在执行存储过程的方法。

// Trigger Stored Procedure after restore. 

private void triggerSP(String connectionStr)

{

    // This doesn't open the Connection. conn.Open() has to be explicitly called.

    

    SqlConnection conn = new SqlConnection(connectionStr);

    try

    {

    

    conn.Open();

    conn.FireInfoMessageEventOnUserErrors = true;

    // Capture messages returned by SQL Server.

    conn.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)

    {

        

        message += " -> " + e.Message + " -> ";

    };

    //conn.InfoMessage += new SqlInfoMessageEventHandler(cn_InfoMessage);

    

    //.create a command object identifying the stored procedure.

    SqlCommand cmd = new SqlCommand("[dbo].[1_IMPORT_DATA_AND_PROCESS_ALL]", conn);

    cmd.CommandTimeout = 0;

    // 2. set the command object so it knows to execute a stored procedure.

    cmd.CommandType = CommandType.StoredProcedure;


    // Add a check here as well.

    // execute the command.

    SqlDataReader rdr = cmd.ExecuteReader();



    string[] info = new string[] { "Message: \n" + message };

    WriteToFile(info);


    // Since we are not using - using block we have to explicitly call Close() to close the connection.

    conn.Close();

    }

    catch (SqlException SqlEx){

    string[] error = new string[3] ;


    string msg1 = "Errors Count:" + SqlEx.Errors.Count;

    string msg2 = null;


    foreach (SqlError myError in SqlEx.Errors)

        msg2 += myError.Number + " - " + myError.Message + "/" ;


    conn.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)

    {

        message += "\n" + e.Message;

    };


    error[0] = msg1;

    error[1] = msg2;

    error[2] = message;


    WriteToFile(error);

    }


问题

我只是从第一个存储过程中取回消息输出,而不是从如下所示[1_IMPORT_DATA_AND_PROCESS_ALL]的从内部调用的存储过程中取回消息输出。[1_IMPORT_DATA_AND_PROCESS_ALL]


慕虎7371278
浏览 76回答 1
1回答

慕丝7291255

再会,笔记!此消息未标记为“社区 wiki”,因此它是由特定人员以他的名义撰写的,这不是共享文章。如果您有评论,请使用评论而不是更改 OP 打算提供的内容(例如内容中的额外学习点)。谢谢!在下面的脚本中,我给出了一个处理嵌套存储过程错误的例子。基本思想是使用TRY/CATCH来防止引发错误并停止事务,并使用OUTPUT将错误信息返回给上层SP这只是一个基本的例子......CREATE or ALTER PROCEDURE L1 (    @InputInt int,    @ErrMessage NVARCHAR(MAX) OUTPUT,    @ErrNum INT OUTPUT)AS    SELECT @@NESTLEVEL AS 'Inner Level'; -- this information present the level of the SP during the execution. It is not needed for the solution but for the sake of the learning and understanding of nested SP    Select 'Start L1'    BEGIN TRY          -- When the ionput is 0 we Generate a divide-by-zero error.          SELECT 1/@InputInt;      END TRY      BEGIN CATCH        SET @ErrMessage = ERROR_MESSAGE()        SELECT @ErrMessage    END CATCH;    SET @ErrNum = @@ERROR    IF (@ErrNum > 0) Begin       SELECT 'L1 error Number: ' + CONVERT(NVARCHAR(10), @ErrNum)       Return    END    ELSE       select 'L1 OK'GOCREATE or ALTER PROCEDURE L2 (    @InputInt int) AS       Declare @ErrMessage NVARCHAR(MAX) = '', @ErrNum INT = 0    SELECT @@NESTLEVEL AS 'Outer Level';    BEGIN TRY        EXEC L1 @InputInt, @ErrMessage, @ErrNum;    END TRY    BEGIN CATCH        SELECT 'There was error!'        select @@ERROR    END CATCHGOEXECUTE L2 1 -- OKGOEXECUTE L2 0; --Raise error in the nested stored procedures GO分享编辑跟随
打开App,查看更多内容
随时随地看视频慕课网APP