C# 当数据库中的数据不正确时,是否应该引发异常?
在这个特定的应用程序中,没有单独的数据层,数据访问代码位于实体本身中。例如,考虑一个客户实体,然后在Customer .CS文件中定义成员和属性,您有方法将客户对象加载到下面。C# 当数据库中的数据不正确时,是否应该引发异常?,c#,asp.net,data-access-layer,C#,Asp.net,Data Access Layer,在这个特定的应用程序中,没有单独的数据层,数据访问代码位于实体本身中。例如,考虑一个客户实体,然后在Customer .CS文件中定义成员和属性,您有方法将客户对象加载到下面。 public bool TryLoad(int customerID, out Customer customer) { bool success = false try { //code which calls the db and fills a SqlDataReader
public bool TryLoad(int customerID, out Customer customer)
{
bool success = false
try
{
//code which calls the db and fills a SqlDataReader
ReadDataFromSqlDataReader(reader);
success = true;
}
catch(Exception ex)
{
LogError();
success = false;
}
return success;
}
现在,在ReadDataFromSqlDataReader(reader)中,使用tryparse将数据从读取器加载到对象中。e、 g
public void ReadDataFromSqlDataReader(reader)
{
int.TryParse(reader["CustomerID"].ToString(), out this.CustomerID);
PhoneNumber.TryParse(reader["PhoneNumber"].ToString(), out this.PhoneNumber);
... similar TryParse code for all the other fields..
}
使用TryParse从阅读器读取所有属性是一种好的做法吗?一位开发人员告诉我,这样做是因为TryParse比int.Parse有更好的性能。但是,当从db读取的值与代码期望值不一致时,您不希望抛出异常吗?我的意思是,在这种情况下,如果数据库中有一个错误的电话号码,那么可能根本不应该初始化对象,而不是加载一个空电话号码的对象?是的,遵循fail fast原则,当返回的值无法转换为预期类型时,您希望抛出异常
如果其中一个操作失败,而您继续操作,就好像什么也没发生一样,那么您很可能会遇到难以捕捉和精确定位的奇怪错误:当对象本应更新现有行时将其添加到数据库中,数据神秘地消失,狗和猫生活在一起。。。你明白了
另一方面,如果您立即抛出异常,您确切地知道问题所在,并且可以捕获它并在它变得更糟之前修复它
TryParse
在失败的情况下会比Parse
工作得更快,这仅仅是因为它不必抛出异常(可能会很昂贵),但是如果您假设事情会成功(这段代码通过不使用解析结果来实现),您应该使用Parse
在插入和/或更新数据时,您正在执行哪种验证
只要您在这里应用某种形式的验证,我个人就不会验证来自数据库的数据,因为您应该确信您只输入了有效的数据。如果您要处理它,是的,您应该抛出一个异常。但是,如果您不关心异常,并且希望筛选正确的数据并使用它(在本例中为非零),则可以跳过。As,
TryParse
返回布尔值。因此,我可以基于布尔值绕过/继续即将到来的逻辑/任何数据库请求。我不会让这种例外发生在这样的场景中。为此,我将做日志等
解析
抛出异常
如果您确定该值有效,请使用它
TryParse
返回一个bool,指示它是否成功
它只是在内部尝试/捕获,这就是为什么在没有异常的情况下实现它,以使其速度更快
如果值可能无效,请使用它
将数据插入数据库时,必须执行有效的验证。这不是一个好的设计,用它可以在数据库中输入坏数据。若数据库包含错误的电话号码,若必须输入电话号码,则应要求用户再次输入电话号码。若电话号码不太重要,则在数据错误的情况下,您可以将电话号码初始化为null。我不会为此使用TryParse。
如果我的数据库里有垃圾,我想把它处理掉。
如果数据在解析方面不明确(例如,作为字符串包含int或double的Varchar)
我想整理一下我的模式,TryParse作为类型检测将是一种快速而简单的方法。对我来说听起来很特别TryParse
只有在处理坏数据时才有更好的Parse
性能。我无法想象性能会有什么不同。它会吞噬异常,因此实际上包含与您在外部使用.Parse编写的代码相同的代码。只有当您尝试将数据库数据转换为不兼容的类型时,解析才会失败,对吗。虽然我猜没有多少数据库具有本机PhoneNumber
typeAs,TryParse
返回布尔值。因此,我可以基于布尔值绕过/继续即将到来的逻辑/任何数据库请求。我不会让这种例外发生在这样的场景中。为此,我将做日志记录等,你能100%保证它将始终是良好的数据吗?当dba直接打开表并输入“stjkerij”作为电话号码时会发生什么?问题是,在开发系统时,最初没有进行验证。例如,PhoneNumber不是代码中定义的类型,基本上是字符串。几年后,其中一位开发人员将PhoneNumber定义为一种类型,现在大多数情况下,只要插入数据,它就是有效数据。但是旧代码的混乱,我不能100%确定来自数据库的数据总是有效的。此外,如果我失败并记录这些,我实际上可能能够从数据库中删除坏数据。@john,不管数据是否好,重要的是你是否能感觉到它是好的,如果不是。我完全不同意。调用此方法的程序员将假定他们得到的对象已完全填充。给他们一个没有完全填充的对象是自找麻烦。即使没有处理代码,也最好让系统发生惊人的故障,并让您注意到您有一个bug,而不是让您的其余代码像没有错误一样使用这些数据。您是对的,但这是一种选择。抛出或不抛出异常取决于您试图做什么。我说如果你在乎的话,你应该抛出一个异常,但情况可能并非总是如此。也许他想在中的“电话号码”列中显示一条消息