我继承了使用Entity Framework进入新应用程序的长时间运行的存储过程。存储过程通过使用
显示运行时的信息性消息RAISERROR (@MSG, 0, 1) WITH NOWAIT
将某些内容作为信息发布。
一般来说,调用我使用的存储过程
context.Database.ExecuteSqlCommand("exec dbo.LongStoredProcedure", parameters);
我认为我可以通过设置事件监听器拦截消息,如:
var sqlConn = context.Database.Connection as SqlConnection;
if (sqlConn != null) sqlConn.InfoMessage += sqlConn_InfoMessage;
但是,在这种情况下,只要存储过程完成运行,sqlConn_InfoMessage就会受到一次攻击,所有消息都与SqlInfoMessageEventArgs消息中的换行连接。
我想要的是捕获消息,因为它们在存储过程中被发出。在这种情况下我该怎么做?直接通过sqlConn来处理整个事情?
答案 0 :(得分:0)
最后this answer指出我想去的地方:
sqlConn.InfoMessage += sqlConn_InfoMessage);
var command = sqlConn.CreateCommand();
command.Transaction = context.Database.CurrentTransaction.UnderlyingTransaction
as SqlTransaction;
command.CommandTimeout = 60 * 20;
command.CommandText = "dbo.LongStoredProcedure";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddRange(parameters.ToArray());
command.ExecuteScalar();
让我获得sqlConn_InfoMessage的实时更新。