我使用 C# 编写的数据库应用程序,使用 sql server 作为后端。为了数据完整性,我尝试在数据库级别上尽可能多地执行——关系、检查约束、触发器。
由于它们,如果数据不一致,保存/更新/插入可能会失败,并且应用程序会抛出 SqlException。
我在 UI 中进行了各种验证(如果输入的数据无效,则向用户提供有意义的信息),也在 BL 中进行各种验证,它将错误报告回 UI 并呈现给用户。
但是,有些事情确实无法在应用程序中检查,并且由数据库处理:我的意思是当没有级联删除并且用户尝试从主表中删除实体等时删除错误。
例如,Employees 表在许多关系中充当主人 - 员工经理、部门经理、收银员、团队负责人、团队成员等。如果我添加一个不涉及任何关系的新员工,我可以删除它,但用户尝试删除这种关系中的主控,由于在数据库级别强制执行 RI 规则,删除失败(因为它应该),没关系。
我在尝试中编写删除代码...捕获并处理异常,告诉用户他不能删除该员工。但我想为用户提供更有意义的信息——无法删除记录的原因。也许这只是一个测试员工记录,它也被添加到了一个测试团队中。但是用户忘记了添加的位置,如果我可以告诉“无法删除员工,因为它是 T1 团队的一部分”,用户就会知道先去 T1 团队,删除用户然后再次尝试删除它。这是一个简单的例子,因为正如我所说的,一个员工可以参与很多关系——在我的应用程序中,我至少有 20 个。
解决方法是显示SqlException报告的Message,但这一点也不优雅。首先,这个消息是非常技术性的——它谈论的是 FK、PK、Triggers,这些对用户来说毫无意义,会吓到他们。其次,我的应用程序使用多语言 UI,所有菜单和消息都以用户选择的语言显示(在登录时或在用户配置文件中选择)。并且来自 SqlException 的消息是英语(如果我使用英语版本)或者最糟糕的,不太常见的语言,如德语或荷兰语,如果碰巧 sql server 使用该语言。
是否有任何常用或推荐的方法从 sql 异常中提取有意义的信息,以便能够向用户呈现有意义的消息(例如,什么关系或子表导致失败,或者什么触发器等)。但是我可以在程序中以独立于语言的方式进行测试,然后以用户友好的方式格式化我自己的错误消息?
你如何处理这种情况?
感谢所有答案
(PS:抱歉发这么长)