web-dev-qa-db-ja.com

System.InvalidCastException:指定されたキャストは無効です。エラー

私は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._を示しています。

私がここで何をしたのか分かりません。助けてください。

11
user2168042

InvalidCastExceptionの原因として最も可能性が高いのは、x.Field<Int32>("userid")行です。データの実際のタイプがField<T>に渡されたタイプと一致しない場合、Field<T>拡張メソッドはInvalidCastExceptionをスローします。したがって、useridInt32ではなかった場合、これがスローされます。

[〜#〜]編集[〜#〜]

あなたのコメントに基づいて、useridのタイプは実際にはUInt32であり、Int32ではありません。これが問題の原因です。以下を使用してみてください、それはうまくいくはずです

x.Field<UInt32>("userid")
10
JaredPar

データベースから返されたデータを確認しないと、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の場合、これを解決する方法はいくつかあります。

  1. MySQLで [〜#〜] ifnull [〜#〜] を使用できるので、データベースクエリからNULLを返さないことを確認してください。
  2. Fieldに渡されるジェネリックにnull許容型を使用します。

    ここで、x.Field( "userid")==(Int32?)usercode

1
BrutalDev