2008-10-07 86 views
2

我想知道每个人都认为从您自己的数据库处理结果的最佳方法是。其他团队可能会参与其中,程序/数据总是有可能被改变,并且会出现错误的结果。我的问题是这个。让异常发生,捕获并记录它或尝试处理所有突发事件并隐藏错误会更好吗?说,像下面的东西。消毒数据库返回数据

if (dr.Table.Columns.Contains("column") && !dr["column"].Equals(DBNull.Value)) 
{ 
    this.value = (type)dr["column"]; 
} 
else 
{ 
    this.value= null; 
} 
+0

这个问题确实与数据库没有多大关系。呼叫服务或DLL也可以这样说...这实际上是一个通用的异常处理问题。 – 2010-11-18 20:50:11

回答

4

就我个人而言,我喜欢快速失败 - 当然有适当的歉意用户消息。有一些值得从中恢复的东西,但是像预期为非null的列是空的,对我来说这听起来更重要。

当然,我也想尝试建立一些烟雾测试,以确保您的生产:)

0

数据库约束应该照顾这个最适合你之前了解它。对于什么不是,我会建议回到数据库设计并修复这些限制。

失败的是,在该字段上返回一个异常将是最好的,以便数据可以被修复(或删除)。

0

处理您认为值得处理的所有事情,并在发生“不可能”事件时处理异常。

由于@AviewAnew说,你可能是一个有点偏执狂,但这并不意味着你错了!

我原以为缺少的列会比空值差得多,那么如何为丢失的列抛出异常呢?

try // wrap everything in a try/catch to handle things I haven't thought of 
{ 

    if (!dr.Table.Columns.Contains("column")) 
    { 
     throw new SomeSortOfException("cloumn: " + column + " is missing"); 
    } 
    else // strictly don't need the else but it makes the code easier to follow 
    { 
     if (dr["column"].Equals(DBNull.Value)) 
     { 
      this.value= null; 
     } 
     else 
     { 
      this.value = (type) dr["column"]; 
     } 
    } 
} 
catch(SomeSortOfException ex) 
{ 
    throw; 
} 
catch(Exception ex) 
{ 
    // handle or throw impossible exceptions here 
} 

另一方面......如果你打算在整个代码中进行所有这些检查,维护费用将会相当可观。 ......这是另一回事。

您的电话!

0

我会尽力确保它不会发生在第一位或最小化发生的可能性。

例如来自jonSkeet的帖子。如果您希望列的非空条件对该列有约束?如果不是,那么您可能会期望它,因为DBA/DB开发人员告诉您这将是这样。我会告诉他们,你会依靠这个事实,并鼓励,鼓励,哄骗他们添加非空约束。如果您期望独特的价值观,那么请求一个独特的约束。只有大写字符,添加检查约束。代码检查全部大写,然后下一个应用程序和下一个应用程序以及下一个应用程序可以完成一次时,没有什么意义。记住干 - 不要重复自己。

对于缺少的列错误,我的主动方法是确保db开发团队了解应用程序使用哪些表和视图以及过程。每个应用程序应该有它自己的用户名,每个应用程序的用户名应该被授予只选择它需要的表格 - 而不是作为安全功能,但作为文档。如果您更改此表格,则会被这些应用程序使用。与proc一样,将执行授予使用它的应用程序。如果你保持这种紧张状态,并且灌输“在进行修改时检查外部依赖性”的态度,那么您将面临很多错误。