2013-02-12 23 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()。