2013-02-12 21 views
0

我有一个Class(我们称之为实体)的名称映射到数据库Table(Person table)的Person。该表的记录可以在所有字段中包含空值,但是一个是PK。处理有错误的对象,并且不能与null或DBnull.value比较

这是短暂的,我们如何定义我们的Person实体:

... 
private System.DateTime _BirthDate; 

[DisplayName("Birth Date")] 
[Category("Column")] 
public System.DateTime BirthDate 
{ 
    get 
    { 
     try { return _BirthDate; } 
     catch (System.Exception err) 
     { throw new Exception("Error getting BirthDate", err); } 
    } 
    set 
    { 
     try { _BirthDate = value; } 
     catch (System.Exception err) 
     { throw new Exception("Error setting BirthDate", err); } 
    } 
} 
... 

的问题是,当我得到的人选名单

var dsPersons = DataHelper.personTabelAdapter.GetFilteredPersons(nationalNo, name); 

这是空的分贝这些领域,是具有例外,所以我无法将它们与null或甚至是DBNull.Value进行比较,请在调试中查看我的代码的以下图像:

enter image description here

我想检查它们为空,以便我可以决定填写我的新对象字段或不填写它们。

这里的异常的细节我得到

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Data.StrongTypingException: The value for column 'BirthDateFa' in table 'Person' is DBNull. ---> System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'. 

    at EcomService.Data.EcomDS.PersonRow.get_BirthDateFa() in c:\Projects\Project\EcomForms\EcomService\EcomService\Data\EcomDS.Designer.cs:line 30607 

    --- End of inner exception stack trace --- 

    at EcomService.Data.EcomDS.PersonRow.get_BirthDateFa() in c:\Projects\Project\EcomForms\EcomService\EcomService\Data\EcomDS.Designer.cs:line 30610 

    at EcomService.Classes.Entities.Person.GetFilteredPersons(String nationalNo, String name) in c:\Projects\Project\EcomForms\EcomService\EcomService\Classes\Entities\Person.cs:line 898 

    at EcomService.EService.GetFilteredPersons(String nationalNo, String name) in c:\Projects\Project\EcomForms\EcomService\EcomService\EService.asmx.cs:line 172 

    --- End of inner exception stack trace --- 

这是我的Web方法

[WebMethod] 
public List<Person> GetFilteredPersons(string nationalNo, string name) 
{ 
    return Person.GetFilteredPersons(nationalNo, name); 
} 

调用此方法

static public List<Person> GetFilteredPersons(string nationalNo, string name) 
{ 
    List<Person> persons = new List<Person>(); 
    var dsPersons = DataHelper.personTabelAdapter.GetFilteredPersons(nationalNo, name); 
    foreach (var dsPerson in dsPersons) 
    { 
     Person person = new Person(); 
     person.BirthDateFa = dsPerson.BirthDateFa; 
     //I don't know how to deal with the exceptions here 
     .... //other fields 
     persons.Add(person); 
    } 
    return persons; 
} 

我真的卡在这一块。您的答复将受到欢迎。

+0

为什么你会捕捉异常,只是重新抛出它包裹在一个平淡的'System.Exception'?这是添加代码,真的只是遮蔽事情。除此之外,你需要告诉我们你得到了什么样的异常。您已经显示了一个显示StrongTypingException的屏幕截图,但您应该查看一个特定异常的*详细信息*。 – 2013-02-12 06:51:45

+0

你好乔恩。我会在一分钟内添加例外的细节。 – 2013-02-12 07:10:46

+0

@JonSkeet详细信息已添加。 – 2013-02-12 07:14:34

回答

2

出现异常是因为您使用的是强类型DataSet。 StrongTypingException文档说:

当用户访问DBNull值时,由强类型DataSet引发的异常。

请阅读这篇文章, http://msdn.microsoft.com/en-us/magazine/cc163877.aspx

例子:

object.Is<ColumnName>Null() //which returns true or false 
+1

谢谢Rajesh就是这样。 – 2013-04-20 04:16:11

0

您可以通过调用返回布尔值的Is(columnname)Null()函数来检查类型化数据集中的对象是否为null。那些强类型异常是由于列为空。例如dsPerson.IsBirthDateNull()。