4

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

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 用于将读取器中的数据加载到对象中。例如

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 具有更好的性能。但是,当您从数据库读取的值不符合您的代码期望的值时,您不希望抛出异常吗?我的意思是在这种情况下,如果数据库中有错误的电话号码,那么也许根本不应该初始化该对象,而不是加载一个带有空电话号码的对象?

4

6 回答 6

4

是的,遵循快速失败原则,您可能希望在返回无法转换为预期类型的​​值时抛出异常。

如果其中一个操作失败并且您继续进行,就好像什么都没发生一样,您可能会遇到难以捕捉且难以查明的奇怪错误:对象在本应更新现有行时被添加到数据库中,数据神秘地消失了,狗和猫住在一起......你明白了。

另一方面,如果您立即抛出异常,您就可以准确地知道问题出在哪里,并且可以在问题变得更糟之前捕获并修复它。

TryParse将比Parse失败的情况更快地工作,这仅仅是因为它不必抛出异常(这可能很昂贵),但是如果您假设事情会成功(此代码通过不使用解析的结果来实现),您应该使用Parse.

于 2012-04-17T14:41:20.330 回答
1

将数据插入数据库时​​执行有效验证。这不是一个好的设计,可以在数据库中输入不良数据。如果数据库包含错误的电话号码,如果它是强制性的,则应要求用户再次输入电话号码,如果电话号码不是那么重要,您可以将电话号码初始化为 null 以防数据错误。

于 2012-04-17T14:46:43.510 回答
1

我不会为此使用 TryParse。如果我的数据库中有垃圾,我希望得到解决。如果数据在解析方面不明确(例如,Varchar 带有 int 或 double 作为字符串),我想整理我的模式,TryParse 作为类型检测将是一种快速而简单的技巧。

于 2012-04-17T14:52:25.423 回答
0

当数据被插入和/或更新时,你在做什么类型的验证?

只要您在这里应用某种形式的验证,我个人就不会验证来自数据库的数据,因为您应该确信您只输入了有效数据。

于 2012-04-17T14:42:07.053 回答
0

如果你会处理它,那么是的,你应该抛出一个异常。但是,如果您不关心异常,并且如果您要过滤正确的数据并使用它(在这种情况下为非零),您可以跳过。

于 2012-04-17T14:43:43.420 回答
0

如,TryParse返回布尔值。所以,我可以ByPass/Continue在ValueUpcoming Logic/Any Database的基础上提出请求。Boolean我不会让异常发生在这样的场景中。为此,我将进行日志记录等。

解析

  1. 引发异常。
  2. 如果您确定该值有效,请使用它

尝试解析

  1. 返回一个布尔值,指示它是否成功
  2. 它只是在内部尝试/捕获为什么没有例外地实现,所以它很快
  3. 在值可能为 InValid 的情况下使用它
于 2012-04-17T14:45:21.373 回答