2013-08-24 97 views
3

我在一個C#ASP.NET項目。System.InvalidCastException:指定的轉換無效。錯誤

我有一個類型爲int的userid字段的MySQL表。

現在我想要得到使用LINQ的userid值等於某個值的行數。

要做到這一點,我寫了下面的方法:

public int getCount(int usercode) { 
    int count = 0; 
    DataTable mytable = getAllRowsAndReturnAsDataTable(); // assigning a DataTable value to mytable. 
    if (mytable.Rows.Count > 0) { 
     count = (from x in mytable.AsEnumerable() where x.Field<Int32>("userid") == usercode select x).Count(); 
    } 
    return count; 
} 

但它顯示出紅色高亮區域count = (from x in mytable.AsEnumerable() where x.Field<Int32>("userid") == usercode select x).Count();錯誤System.InvalidCastException: Specified cast is not valid.

我不知道我在這裏做錯了什麼。請幫忙。

回答

4

InvalidCastException最可能的原因是x.Field<Int32>("userid")系列。如果數據的實際類型與傳遞給Field<T>的類型不匹配,則Field<T>擴展方法將拋出InvalidCastException。因此,如果userid不是Int32這會拋出。

編輯

根據您的意見的userid的類型實際上是UInt32,而不是Int32。這是導致問題的原因。嘗試使用下面的,它應該工作

x.Field<UInt32>("userid") 
+0

'mysql> desc vticketuser; + -------------- + ------------------ + ------ + ----- + - -------- + ------- + |字段|類型|空| Key |默認|額外| + -------------- + ------------------ + ------ + ----- + - -------- + ------- + | idticket | int(10)unsigned | NO | | 0 | | |用戶ID | int(10)unsigned | NO | | NULL | | ' 這是字段 – user2168042

+1

@ user2168042您將數據庫定義與託管代碼時的值混合在一起。嘗試查看代碼中原始的''userid''值,調用'.GetType'並查看它創建的類型爲 – JaredPar

+0

我不知道我是否正確地做它..但我試過像這樣 ' string ty = t.Rows [0] [「userid」]。GetType()。ToString();' 它說「System.UInt32」 – user2168042

0

不看從數據庫回來的數據,我只能猜測你的LINQ的下面的部分是有過錯:

x.Field<Int32>("userid") 

你的用戶ID列價值可能不是一個整數,我會把我的錢是NULL?

UPDATE:你能否證實它不是被打破了現場通話?只需更改您的代碼像這樣沒有現場電話:

public int getCount(int usercode){ 
    int count = 0; 
    DataTable mytable = getAllRowsAndReturnAsDataTable(); // assigning a DataTable value to mytable. 
    if (mytable.Rows.Count > 0) { 
    count = mytable.AsEnumerable().Count(); // No WHERE function call so no casting. 
    } 
    return count; 
} 

你也可以檢查一下值由mytable.AsEnumerable()在例如一個觀察窗口返回,以確保一切看起來是正確的。如果上面的代碼正常工作,那麼現場調用就會爆炸。找出哪些行不能轉換爲Int32並從那裏開始。

如果它實際上是NULL,有很多方法可以解決這個問題。

  1. 確保您不會從您的數據庫查詢中返回NULL,在MySQL中您可以使用IFNULL
  2. 使用可空類型爲通用傳遞到現場:

    其中x.Field( 「用戶id」)==(的Int32?)用戶代碼

+0

,我100%確定。我重新檢查了它。 – user2168042

+0

@ user2168042 - 更新了答案,詳細說明了如何查找數據是否正確以及實際上是否爲字段。 – BrutalDev

相關問題