You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ADO.NET中捕获存储过程调用输出的消息?

如何用C#捕获SQL Server存储过程的PRINT输出内容

SQL Server存储过程里的PRINT语句输出,会通过SqlConnection的InfoMessage事件向外发送,只要订阅这个事件就能捕获到这些消息,具体实现步骤如下:

核心实现逻辑

  • 初始化SqlConnection时,订阅其InfoMessage事件,事件处理方法可直接获取PRINT输出的内容
  • 若需要同时捕获错误级别的实时消息(比如RAISERROR WITH NOWAIT),需将连接的FireInfoMessageEventOnUserErrors属性设为true
  • 执行存储过程时,不管调用ExecuteNonQuery、ExecuteReader还是ExecuteScalar,PRINT消息都会触发事件

完整代码示例

using System;
using System.Data.SqlClient;

class PrintMessageCapture
{
    static void Main()
    {
        // 替换为你的数据库连接字符串
        string connString = "Server=你的服务器名;Database=你的数据库名;Integrated Security=True;";

        using (SqlConnection connection = new SqlConnection(connString))
        {
            // 订阅InfoMessage事件,捕获PRINT输出
            connection.InfoMessage += (sender, args) =>
            {
                Console.WriteLine($"PRINT输出: {args.Message}");
            };

            // 开启后,错误级别的消息也会通过InfoMessage事件传递,而非直接抛出异常
            connection.FireInfoMessageEventOnUserErrors = true;

            connection.Open();

            using (SqlCommand cmd = new SqlCommand("YourStoredProcedureName", connection))
            {
                cmd.CommandType = System.Data.CommandType.StoredProcedure;

                // 若存储过程需要参数,添加对应参数
                // cmd.Parameters.Add("@Param1", SqlDbType.VarChar).Value = "参数值";

                // 执行存储过程
                cmd.ExecuteNonQuery();
            }
        }
    }
}

补充说明

  • 每条PRINT语句会单独触发一次InfoMessage事件,args.Message就是该PRINT的具体内容
  • 如果存储过程中有多条PRINT,事件会被多次触发,可根据需求自行处理消息的拼接或逐条记录
  • FireInfoMessageEventOnUserErrors默认是false,此时错误级别的消息会直接抛出SqlException,而不会通过InfoMessage事件传递

内容的提问来源于stack exchange,提问作者Jonathan Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:39:57