如何在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
相关产品推荐
相关产品推荐

