Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当数据库中的数据不正确时,是否应该引发异常?_C#_Asp.net_Data Access Layer - Fatal编程技术网

C# 当数据库中的数据不正确时,是否应该引发异常?

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

在这个特定的应用程序中,没有单独的数据层,数据访问代码位于实体本身中。例如,考虑一个客户实体,然后在Customer .CS文件中定义成员和属性,您有方法将客户对象加载到

下面。
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,而不是让您的其余代码像没有错误一样使用这些数据。您是对的,但这是一种选择。抛出或不抛出异常取决于您试图做什么。我说如果你在乎的话,你应该抛出一个异常,但情况可能并非总是如此。也许他想在中的“电话号码”列中显示一条消息