处理具有错误且与null或DBnull.value无法比较的对象

时间:2013-02-12 06:48:35

标签: c# .net exception null dbnull

我有一个Class(我们称之为实体)Named Person,它被映射到数据库Table(Person表)。该表的记录可以在所有字段中包含空值,但是其中一个是PK。

这是我们如何定义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);

那些在db中为空的字段有异常所以我无法将它们与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 ---

这是我的网络方法

[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;
}

我真的陷入了这件事。欢迎您的回答。

2 个答案:

答案 0 :(得分:2)

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

当用户访问DBNull值时强类型DataSet抛出的异常。

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

示例:

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

答案 1 :(得分:0)

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