私はC#ASP.NETプロジェクトに参加しています。
タイプint
のユーザーIDフィールドを持つ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.
_を示しています。
私がここで何をしたのか分かりません。助けてください。
InvalidCastException
の原因として最も可能性が高いのは、x.Field<Int32>("userid")
行です。データの実際のタイプがField<T>
に渡されたタイプと一致しない場合、Field<T>
拡張メソッドはInvalidCastException
をスローします。したがって、userid
がInt32
ではなかった場合、これがスローされます。
[〜#〜]編集[〜#〜]
あなたのコメントに基づいて、userid
のタイプは実際にはUInt32
であり、Int32
ではありません。これが問題の原因です。以下を使用してみてください、それはうまくいくはずです
x.Field<UInt32>("userid")
データベースから返されたデータを確認しないと、LINQの次の部分に問題があると推測できます。
x.Field<Int32>("userid")
あなたのユーザーID列の値はおそらくintではありません、私はそれが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の場合、これを解決する方法はいくつかあります。
Fieldに渡されるジェネリックにnull許容型を使用します。
ここで、x.Field( "userid")==(Int32?)usercode