从完整性破坏的数据库中获取数据

时间:2012-02-08 13:43:47

标签: c# mysql database sql-server-2008

应用程序在从数据库中获取数据时是否应该出现意外情况?可以说我们已经在列(int或text)中存储了枚举值。当我们从数据库返回值时,我们将值转换为枚举类型。如果某人手动更改了数据库中的数据并破坏了数据完整性,那么我们的演员表会失败怎么办?

另一个例子是当c#中的数据类型的范围小于数据库中的等效字段时。如果有人手动将值放在此值中,让我们说数据库最大值,则应用程序将抛出范围异常。

我们应该如何处理这种例外?

编辑:由于大多数答案都相似,我将重新解释这个问题。暗示应用程序中存在异常日志记录。问题是:当用户查询某些数据,并且数据已损坏(不是来自应用程序CRUD操作,而是来自外部)时,从数据库到模型的数据转换将失败,并且用户将根本不会获得任何数据。在应用程序中有这样的状态是否可以接受,因为应用程序本身并没有导致它?

验证数据会导致数据获取速度大幅下降。想象一下,如果超出范围,你需要检查每个十进制值吗?

3 个答案:

答案 0 :(得分:0)

这取决于,通常是否可能发生?

就我而言,我所做的就是做事:

  1. 记录可执行文件所做的一切(对于这种情况,它可以用来识别它的失败位置)
  2. 使用批处理文件运行时,检查退出状态,如果不是0(发生错误),请发送电子邮件给我!
  3. 有了这个,我知道如果发生了什么,我可以证明这不是我的错。


    关于您的更新,我可以说它取决于!

    就我而言,我构建了有关所提供功能数据的项目。在所有项目中,我们都有一套客户需要批准的要求(一个可能是某个表格中的数据)。

    客户接受要求并且瞧!因此,如果某些事情发生变化,那不是我们的错,我们是安全的,因为客户接受了这些要求。

答案 1 :(得分:0)

由于你的数据库处于较低的水平,你的人类容易犯错,所以你绝对应该进行这样的检查。原因是调试非常昂贵,所以当其中一个错误确实发生时(因为它不可避免地会发生),作为一种防御措施,你应该尽早捕获这些错误,而不是让它们传播到你的程序中并导致更微妙的,其他地方很难找到错误。

如果一个奇怪的值进入你的数据库是“可证明是不可能的”,人们可能会争辩说这样的检查是不必要的。例如,您可以在数据库列上添加列约束。即使在这种情况下,也可以将代码检查保留为防御措施,除非您可以认为此类检查会降低系统性能(他们可能不会这样做)。

答案 2 :(得分:0)

我总是把它作为标准做法,将数据层中的任何数据库交互代码放在try...catch块中,以便您可以文明的方式处理这种情况。

我不检查是否存在任何可能性,但是从长远来看支持代码时,能够记录异常将非常有用。

对于现场系统而言,拥有此类信息总是好的,尤其是当您指责客户摆弄他们不应该拥有的东西时。

修改

正如我所说,你不能检查每一个可能性,但是你可以捕获由诸如将值转换为不存在的枚举之类的情况引起的异常。

除了极端情况之外,不可能检查超出范围的值。一个字段意外返回DBNull或无法从数据库数据类型转换为模型数据类型。在这种情况下,处理错误并向用户显示错误消息或“VALUE UNKNOWN”类型指示符应该没问题。

这里的问题是您有一个用户在不使用您的应用程序的情况下更改数据。

您可能已在数据模型中实施IDataErrorInfo,专门用于验证用户输入,如果不是here示例,或者类似的东西。

但你无法真正应对'腐败'的数据是一个有效的值,即如果你的枚举字段被改为一个正确的值明智但逻辑上不正确你不会知道,直到你来使用它,它是错。

必须采取务实的方法,因为你正确地说,从数据库中检索数千甚至数百个值的验证会对性能产生不可接受的打击。

但是说“出现了错误,请联系您的系统管理员”或类似的内容在我看来完全可以接受。