2011-12-07 72 views
2

我使用Linq來獲取以下例外數據集「System.InvalidCastException:指定的轉換無效」。Linq To數據集錯誤System.InvalidCastException:指定的轉換無效

問題如下我的模型有兩個int類型的值。數據庫中的值不是必需的,所以有些字段爲空。我已將表讀入數據集,現在我需要使用以下代碼查詢數據集。

//model 
public class Model 
{ 
    // Public Properties 
    ... 
    ... 
    ... 
    public int? YearBegin { get; set; } 
    public int? YearEnd { get; set; } 
} 

//query 
var list = from m in data.Tables["Models"].AsEnumerable() 
select new Model 
{ 
    // rest of members omitted to simplify 
    YearBegin = m.Field<int>("YearBegin"), 
    YearEnd = m.Field<int>("YearEnd") 
}; 

我曾嘗試以下沒有工作過:

m.Field<int?>("YearBegin") 
YearEnd = m.IsNull("YearEnd") ? null, m.Field<int>("YearEnd") 

有沒有檢查該字段有()類似String.IsNullOrEmpty值的另一種方式。 使用string類型的可能性也不大......

感謝

+0

什麼發生在您嘗試'YearBegin = m.Field (「YearBegin」)'?你有沒有得到同樣的錯誤? – Rondel

+0

是的同樣的錯誤。 m.IsNull(「YearEnd」)似乎也一直都是正確的。 – user655261

+0

儘管您的模型可能將字段設置爲int,但是列類型的基礎數據庫是什麼?無效的轉換可能是因爲您試圖轉換不兼容的類型(如Oracle喜歡將數字列作爲十進制返回)。在這種情況下,您可能需要將日期/日期時間轉換爲DateTime並提取Year屬性。 – Joshua

回答

1

您使用的不是類型化的DataSet,所以我的第一個問題將是不DataTable中知道,這些領域應該是'詮釋?首先,還是他們列爲字符串?如果DataTable將這些字段視爲字符串,則會遇到該錯誤。下面的代碼假定TESTDATA DataSet與一型號的DataRow,有兩個可爲空字符串的列YearBegin和年終:

using (TestData ds = new TestData()) 
{ 
     // Typed Rows 
     ds.Models.AddModelsRow("1", "2"); 
     ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST 
     // Untyped rows 
     DataRow r = ds.Models.NewRow(); 
     r[0] = "4"; 
     r[1] = "5"; 
     ds.Models.Rows.Add(r); 


     //query 
     var list = from m in ds.Tables["Models"].AsEnumerable() 
       select new Model 
       { 
        // rest of members omitted to simplify 
        YearBegin = m.Field<int?>("YearBegin"), 
        YearEnd = m.Field<int?>("YearEnd"), 
       }; 
} 

該代碼會遇到InvalidCastException的。然而,當我翻轉在數據表以空Int32的類型,那麼幾乎相同的代碼工作正常:

using (TestData ds = new TestData()) 
{ 
     // Typed Rows 
     ds.Models.AddModelsRow(1, 2); 
     ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST 
     // Untyped rows 
     DataRow r = ds.Models.NewRow(); 
     r[0] = 4; 
     r[1] = 5; 
     ds.Models.Rows.Add(r); 


     //query 
     var list = from m in ds.Tables["Models"].AsEnumerable() 
       select new Model 
       { 
        // rest of members omitted to simplify 
        YearBegin = m.Field<int?>("YearBegin"), 
        YearEnd = m.Field<int?>("YearEnd"), 
       }; 
} 

看看你的數據表。您可以在那裏更正您的問題。該字段投到int?將不會工作,除非你的DataTable字段匹配int?類型。

0

問題解決了,我的工作對傳統接入數據庫和數據類型被存儲爲整數,而不是上長整型這意味着它的數據,因此設置無效轉換異常表示爲Int16的...

相關問題