gpt4 book ai didi

c# - 在数据库应用程序中处理 SqlExceptions 的推荐方法

转载 作者:太空狗 更新时间:2023-10-29 20:53:45 25 4
gpt4 key购买 nike

我开发一个用 C# 编写的数据库应用程序,以 sql server 作为后端。为了数据完整性,我尝试尽可能多地在数据库级别执行 - 关系、检查约束、触发器。

由于它们,如果数据不一致,保存/更新/插入可能会失败,应用会抛出 SqlException。

我在 UI 中进行各种验证(如果输入的数据无效,则向用户显示有意义的信息),也在 BL 中,它将错误报告回 UI,再将错误呈现给用户。

但是,有些事情确实无法在应用程序中检查,并由数据库处理:我的意思是当没有级联删除时删除错误以及用户尝试从主表中删除实体等。

例如员工表在很多关系中充当主人 - 员工经理,部门经理,出纳员,团队负责人,团队成员等。如果我添加一个不涉及任何关系的新员工,我可以删除它,但是用户尝试要删除在这种关系中的主节点,由于在数据库级别强制执行 RI 规则,删除会失败(应该如此),这没关系。

我在 try ... 中编写删除代码...捕获并处理异常,告诉用户他不能删除该员工。但我想给用户更多有意义的信息——记录无法删除的原因。也许它只是一个测试员工记录,它也被添加到一个测试团队中。但是用户忘记了添加的位置,如果我可以告诉“不能删除员工,因为它是 T1 团队的一部分”,用户将知道先去 T1 团队,删除用户,然后再尝试删除它。这是一个简单的例子,因为正如我所说,一名员工可以参与很多关系——在我的应用程序中,我至少有 20 个。

解决方案是显示SqlException 报告的Message,但这一点也不优雅。首先,那个msg是非常技术性的——它谈到了FK、PK、Triggers,这些对用户来说毫无意义并且会吓到他们。其次,我的应用程序使用多语言 UI,所有菜单和消息都以用户选择的语言显示(在登录时或在用户配置文件中选择)。来自 SqlException 的消息是英语(如果我使用英语版本)或最糟糕的、不太常见的语言,如德语或荷兰语,如果碰巧 sql server 使用该语言。

是否有任何通用或推荐的方法从 sql 异常中提取有意义的信息,以便能够向用户呈现有意义的消息(例如,什么关系或子表导致失败,或者什么触发器等)。但是我可以以独立于语言的方式在程序中测试,然后以用户友好的方式格式化我自己的错误消息?

你如何处理这种情况?

谢谢大家的回答

(PS:很抱歉发了这么长的帖子)

最佳答案

不幸的是,这里没有简单的答案。

涉及的工作量将取决于来自业务层的错误消息的一致性。您将需要进行某种形式的从“技术”错误消息到面向用户的消息的转换。

这应该是从您的错误消息中进行某种形式的查找到资源键的问题,该资源键可用于提取特定于语言的错误消息。但是,如果您需要解析消息以获取更多信息(即:表名等),那么它会变得有点棘手。在这种情况下,您可能需要将错误消息映射到某种形式的正则表达式/处理器以及新的资源字符串。然后,您可以使用从原始错误中提取的信息格式化用户的字符串,并将其呈现给用户。

关于c# - 在数据库应用程序中处理 SqlExceptions 的推荐方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1415080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com