微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我使用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块中添加逻辑,该逻辑块决定用户是否可以对错误执行任何操作(确定错误是否可操作)并添加适当的信息.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么