[英]Dapper return print message from stored procedure
我有一个无法修改的存储过程,我正在尝试获取在发生错误时返回的PRINT
消息。 我的存储过程中的代码是。
IF((ISNULL(@ID,''))='')
BEGIN
PRINT N'Error: This ID is invalid.';
RETURN;
END
在我的精巧通话中,我有以下内容:
var storedProcResult = connection.Query("AdventureWorks.dbo.myStoredProcedure", new
{
@ID = null
},
commandType: CommandType.StoredProcedure
);
storedProcResult
的值为0
但我有兴趣获取PRINT
消息。 请指教。
您可以使用下面的结构,只需替换 @ErrorMessage 变量的值。
CREATE OR ALTER PROCEDURE DBO.SPR_PROCEDURE_NAME()AS
BEGIN
DECLARE
@ErrorMessage NVARCHAR(4000)
,@ErrorSeverity INT
,@ErrorState INT
BEGIN TRY
--YOUR CODE HERE
END TRY
BEGIN CATCH
IF (XACT_STATE()) = -1
ROLLBACK TRAN
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH
END
根据 Jeroen 和 Marc 的评论,我编写了一个非常基本的代码来获取单个命令的消息:
var infoMessageBuilder = new StringBuilder();
void OnInfoMessageEvent(object _, SqlInfoMessageEventArgs args)
{
infoMessageBuilder.AppendLine(args.Message);
}
// Register message event listener
cn.InfoMessage += OnInfoMessageEvent;
await cn.ExecuteAsync("AdventureWorks.dbo.myStoredProcedure", new {@ID = null}, commandType: CommandType.StoredProcedure);
// Unregister listener to stop fetching events from the connection
cn.InfoMessage -= OnInfoMessageEvent;
// Get messages as string
var message = infoMessageBuilder.ToString();
我在命令执行之前注册了一个事件处理程序,并将 InfoMessage 事件的所有输出写入 StringBuilder。 处理程序将在执行后被删除。 这对我来说非常好。 希望它可以帮助其他将到达这里的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.