Tsql 在数据层和应用层之间共享消息的最佳方法

Tsql 在数据层和应用层之间共享消息的最佳方法,tsql,Tsql,我一直在寻找处理数据层和应用层之间消息的任何建议或好方法,我的意思是,当在应用程序中使用存储过程或甚至使用直接SQL语句时,数据层应该至少以有组织的方式向上层通知语句/操作结果 我通常在每个存储过程中使用两个变量: @code INT, @message VARCHAR(1024) 我将DML语句放在一个TRY-CATCH块中,在TRY块的末尾,将两个变量都设置为特定的状态,这意味着一切正常,因为您可能会认为我在CATCH块上做了相反的操作,如果需要,将两个变量都设置为某个故障代码,并执行一些

我一直在寻找处理数据层和应用层之间消息的任何建议或好方法,我的意思是,当在应用程序中使用存储过程或甚至使用直接SQL语句时,数据层应该至少以有组织的方式向上层通知语句/操作结果

我通常在每个存储过程中使用两个变量:

@code INT,
@message VARCHAR(1024)
我将DML语句放在一个
TRY-CATCH
块中,在TRY块的末尾,将两个变量都设置为特定的状态,这意味着一切正常,因为您可能会认为我在CATCH块上做了相反的操作,如果需要,将两个变量都设置为某个故障代码,并执行一些错误处理

TRY CATCH
块之后,我使用记录返回结果:

SELECT @code AS code, @message AS message
这两个变量在上层用于验证目的,例如向用户发送消息,以及提交o回滚事务

也许我遗漏了一些重要的特性,比如RAISERROR或not,以更好、更优化、更安全的方式

我会很感激你的建议和良好的实践,不要问厨师的食谱没有必要,只是想法,但如果你决定包括例子,他们会非常欢迎


感谢

我的经验是依靠程序机制的固有工作原理。我的意思是,如果一个过程失败,要么是隐式引发的错误(如果不使用try/catch…简单地说是CRUD),要么是显式引发的错误。这意味着,如果代码落入catch块,并且我想通知应用程序错误,我将使用RAISERROR重新引发错误。在过去,我已经创建了一个自定义的rethrow过程,以便捕获并记录错误信息。您可以使用重试作为抛出自定义消息/代码的机会,该消息/代码可用于引导应用程序走上不同的决策路径。如果调用应用程序在执行时没有收到错误,可以安全地假设它成功了,这样就可以开始显式事务提交

我从未尝试在我自己的通信机制中编写应用程序和存储过程之间的交互-我与之交互的语言中的对象具有检测过程中引发的错误的事件或机制。在我看来,您的方法不一定需要比标准错误处理更多的代码,但我确实发现它令人困惑,因为它似乎是一种重新发明轮子类型的场景


我希望我没有误解你在做什么,我也不想说自己是挑剔的;但是,我确实相信,标准API提供了这种反馈机制,这可能使它变得太复杂了。我建议您仔细阅读,看看它是否能满足您的需要(也请参阅页面底部的Using RAISERROR链接)。

处理此问题的公认方法是让存储过程设置一个返回值 并按照前面的建议使用raise error

我怀疑您缺少的关键是如何将这些数据恢复到客户端

如果您在.net环境中,可以在ado.net代码中检查返回值。可以通过捕获SqlException对象并遍历errors集合来捕获raise错误消息

或者,您可以创建事件处理程序并附加到连接InfoMessage事件。这将允许您在从sql server生成消息时获取消息,而不是在批处理或存储过程完成时获取消息


另一个我不推荐的选项是,将您关心的所有内容跟踪到XML消息中,并从存储过程返回,这比自由文本字段方法提供了更多的结构。

哇,十八个视图,没有一条注释,我认为这不是一个困难的问题。。。但问这些肯定有点毫无意义,因为没有答案,老实说,我很惊讶:|是的,我明白了,你只是在使用API语言本机提供的东西,这是可以的。也许这里唯一有用的是消息没有被加密(说到桌面应用程序),相反,它们在存储过程中是可以管理的。我将检查raiserror,也许使用@ERROR函数谢谢