从数据库提取完整性破坏的数据
应用程序在从数据库中获取数据时应该预料到意外吗?可以说我们已经在列中存储了一个枚举值(int或text)。当我们从数据库返回值时,我们将该值转换为枚举类型。如果某人手动更改了数据库中的数据并破坏了数据完整性,那么我们的演员阵容会失败?从数据库提取完整性破坏的数据
另一个例子是当c#中的数据类型与数据库中等效字段的范围相比较小时。如果任何人手动将该值放入此值,则让对数据库最大值说,然后应用程序会抛出范围异常。
我们应该如何处理这种例外情况?
编辑:由于大多数答案是相似的,我将重新说明这个问题。这意味着应用程序中有异常日志记录。问题是:当用户查询某些数据,并且数据已损坏(不是来自应用程序CRUD操作,而是来自外部)时,从数据库到模型的数据转换将失败,用户将根本没有数据。应用程序中有这样的状态是否可以接受?因为应用程序本身并不导致它?
验证数据会导致数据读取速度大幅下降。想象一下,如果超出范围,你需要检查每个十进制值吗?
我始终认为将数据库交互代码放置在数据层的try...catch
块中是一种标准做法,以便您可以以文明的方式处理此类情况。
我不检查每个可能性,但是从长远来看支持您的代码时能够记录异常将证明是有用的。
在现场系统的情况下,尤其是当您可以指责客户摆弄他们不应该拥有的东西时总是很好。
编辑
就像我说的,你无法检查每一个可能发生的,但可以引起诸如铸造一个值,不存在一个枚举的情况下捕获异常。
实际上不可能检查超出范围的值,而不是极端的例如一个字段意外地返回为DBNull
或未能从数据库数据类型转换为模型数据类型。在这种情况下,处理错误并向用户显示错误消息或“VALUE UNKNOWN”类型指示器应该没问题。
这里的问题是您有一个用户在不使用您的应用程序的情况下更改数据。
您可能已经在您的数据模型中实施IDataErrorInfo
,专门用于验证用户输入,如果没有看here作为示例,或者可能是类似的。
但是,你不能真正应对'损坏'的数据是一个有效的值,即如果你的枚举字段被更改为一个是正确的值明智但逻辑上不正确,你不会知道,直到你来使用它,它错了。
您必须采取务实的方法,正如您所说的那样,从数据库中检索数千甚至数百个值的验证会对性能产生不可估量的影响。
但在我看来,说“有错误,请联系您的系统管理员”或类似的东西是完全可以接受的。
请检查我的问题,我已更新它。 – Goran 2012-02-08 15:19:35
这取决于,通常是可能发生的吗?
以我为例,我做的是对的事情:
- 登录一切可执行没有(也可以是有用的这种情况下,以确定它failled)
- 当一个批处理文件运行它,检查退出状态,如果它不是0(发生错误),给我发一封电子邮件!
有了这个,我知道是否有事发生,我可以证明这不是我的错。
关于您的更新,我可以说这取决于!
就我而言,我建立了关于提供的功能数据的项目。在所有项目中,我们都有一套客户需要制定的要求(其中一个可能是来自某个表格的数据)。
客户接受要求和voilá!所以,如果有什么改变,这不是我们的错,我们因为客户接受要求而得到保障。
既然你有可疑的人类在你的数据库处于低级别,那么你应该执行这样的检查。原因是调试非常昂贵,所以当其中一个错误发生时(因为它不可避免地会发生),作为一种防御措施,您应该尽早捕获这些错误,而不是让它们传播到您的程序中并导致更微妙的,其他地方难以发现错误。
如果奇怪的值进入数据库“可能不可能”,有人可能会说这样的检查是不必要的。例如,你可以在你的数据库列上放置一个列约束。即使在这种情况下,也可以将代码检查作为一种防御措施,除非您可以争辩说这些检查会降低系统的性能(他们可能不会)。
检查数据完整性可能会产生不利影响。请检查我的问题,我已更新它。 – Goran 2012-02-08 15:17:20
你应该通过涂抹和羽化做这些的人来处理这个问题。 Cat-O-Nine是广泛接受的替代品,可以避免焦油对环境的影响。 – 2012-02-08 13:46:06
:)如果我只知道... – Goran 2012-02-08 15:21:39