我想知道每个人都认为从您自己的数据库处理结果的最佳方法是什么。可能涉及其他团队,并且总是有可能改变程序/数据并且会发生错误的结果。我的问题是这个。让异常发生,捕获并记录它或尝试处理所有意外事件并隐藏错误是否更好?比如说,如下所示。
if (dr.Table.Columns.Contains("column") && !dr["column"].Equals(DBNull.Value))
{
this.value = (type)dr["column"];
}
else
{
this.value= null;
}
答案 0 :(得分:4)
就我个人而言,我喜欢快速失败 - 当然,用适当的抱歉用户信息。有一些东西是值得恢复的,但是像你期望非空的列为null的东西听起来对我来说更重要。
当然,我也会尝试设置一些冒烟测试,以确保在生产前找到它:)
答案 1 :(得分:0)
数据库约束应该为您解决大部分问题。对于不是,我建议回到数据库设计并修复这些约束。
如果失败,在该字段上返回异常将是最佳的,这样可以修复(或删除)数据。
答案 2 :(得分: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
}
另一方面......如果您要在代码中放置所有这些检查,那么维护开销将会相当大。 ......这是另一回事。
你的电话!
答案 3 :(得分:0)
我会尽力确保首先不会发生这种情况或尽量减少它的可能性。
例如来自jonSkeet的帖子。如果您希望列的非空条件是否对该列有约束?如果不是,你可能会期待它,因为DBA / DB开发人员告诉你它会是这样的。我会告诉他们你将依赖这个事实并鼓励,刺激,哄骗他们添加非空约束。如果您期望唯一值,则请求唯一约束。只有大写字符,添加一个检查约束。你的代码检查所有大写,然后下一个应用程序和下一个应用程序和下一个应用程序可以完成一次没有任何意义。记住干 - 不要重复自己。
对于缺少的列错误,我的主动方法是确保db开发团队了解应用程序使用哪些表和视图以及过程。每个应用程序都应该拥有自己的用户名,应该只授予每个应用程序的用户名,只选择所需的表 - 不作为安全功能,但作为文档。如果您更改此表,则这些应用程序会使用它。与procs相同,grant执行到使用它的应用程序。如果你坚持这一点,并且在做出改变时“检查外部依赖关系”的态度,那么你将会解决很多这些错误。