加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在db应用程序中处理SqlExceptions的推荐方法

发布时间:2020-12-15 18:28:03 所属栏目:百科 来源:网络整理
导读:我使用SQL Server编写的数据库应用程序,使用sql server作为后端.为了数据完整性,我尝试在数据库级别上尽可能强制执行 – 关系,检查约束,触发器. 由于它们,如果数据不一致,则save / update / insert可能会失败,并且app会抛出SqlException. 我在UI中进行各种验
我使用SQL Server编写的数据库应用程序,使用sql server作为后端.为了数据完整性,我尝试在数据库级别上尽可能强制执行 – 关系,检查约束,触发器.

由于它们,如果数据不一致,则save / update / insert可能会失败,并且app会抛出SqlException.

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

但是,有些东西确实无法在应用程序中检查,并且由db处理:我的意思是当没有级联删除和用户尝试从主表中删除实体时删除错误等.

例如.员工表在很多关系中充当主人 – 员工经理,部门经理,收银员,团队负责人,团队成员等等.如果我添加一个没有涉及任何关系的新员工我可以删除它,但是用户尝试删除一个主要的关系,由于在DB级别强制执行RI规则,删除失败(因为它应该),这没关系.

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

解决方案是显示SqlException报告的消息,但这根本不优雅.首先,msg非常技术性 – 它谈论FK,PK,触发器,这对用户来说毫无意义并且会吓到它们.其次,我的应用程序使用多语言UI,所有菜单和消息都以用户选择的语言显示(在登录时或用户配置文件中选择).并且来自SqlException的消息是英语(如果我使用英语版本)或最差的,不太常见的语言,如德语或荷兰语,如果它发生sql server就是那种语言.

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

你是如何处理这种情况的?

谢谢你的所有答案

(PS:很抱歉很长的帖子)

解决方法

错误消息不等于例外.错误消息是用户应该找到信息性且最重要的可操作性的消息.我建议您阅读 User Experience Guidelines中有关于错误消息的一些指导原则.苹果在 Writing Good Alert Messages也有很好的通用指南.

您会立即注意到大多数(如果不是全部)SQL错误都不是好的最终用户消息. ‘约束FKXF#455违规’ – 最终用户的错误. ‘文件组已满’ – 最终用户的错误. ‘死锁’ – 同样的.好的应用程序做的是将用户的角色分开.管理员需要查看这些错误,而不是最终用户.因此,应用程序始终记录包含所有详细信息的完整SQL错误,最终通知管理员,然后向用户显示不同的错误,例如“发生系统错误,管理员已收到通知”.

如果SQL错误可以由最终用户操作,那么您可以向他显示一条错误消息,指示他如何解决问题(例如,更改输入中的发票日期以满足约束).但即使在这种情况下,大多数情况下你都不应该直接向用户显示SQL错误(你已经看到了一个非常好的理由,为什么不:本地化).我知道这会为您的开发团队带来更大的工作量.您必须知道在每种情况下用户可以操作的错误,可能会遇到大量错误.这是众所周知的,这就是为什么优秀的程序管理员知道大约80%的代码正在处理错误情况,以及为什么“完成”的应用程序通常意味着完成了20%.这就是伟大的应用程序与普通应用程序的不同之处:它们在出现问题时的行为方式.

我的建议是启动渐进式披露原则.显示声明“操作失败”的一般错误消息.如果用户按下错误消息对话框上的“显示详细信息…”按钮,则显示更多详细信息,并显示SqlError集合(顺便说一句,您应该始终记录并显示整个SqlError集合SqlException.Errors,而不是SqlException).使用SqlError.Number属性在catch块中添加逻辑,该逻辑块决定用户是否可以对错误执行任何操作(确定错误是否可操作)并添加适当的信息.

不幸的是,没有精灵尘埃.您正在触摸可能是项目中最困难部分的脚蹄.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读