13

私は C# ASP.NET プロジェクトに参加しています。

type の userid フィールドを持つ MySQL テーブルがありますint

ここで、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;
}

しかし、赤いハイライト領域にエラーがSystem.InvalidCastException: Specified cast is not valid.表示されています。count = (from x in mytable.AsEnumerable() where x.Field<Int32>("userid") == usercode select x).Count();

ここで何が間違っていたのかわかりません。助けてください。

4

2 に答える 2

12

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

編集

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

x.Field<UInt32>("userid")
于 2013-08-24T18:30:29.137 に答える
1

データベースから返されるデータを見ずに、LINQ の次の部分に問題があるとしか推測できません。

x.Field<Int32>("userid")

あなたのユーザーID列の値はおそらくintではありません.NULLにお金をかけますか?

更新:壊れているのは Field 呼び出しではないことを確認できますか? Field 呼び出しを使用せずに、コードを次のように変更するだけです。

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() によって返される値を調べて、すべてが正しく見えることを確認することもできます。上記のコードが機能する場合は、Field 呼び出しが失敗しています。Int32 にキャストできない行を見つけて、そこから移動します。

実際に NULL の場合、これを解決する方法はいくつかあります。

  1. データベース クエリから NULL を返さないようにしてください。MySQL ではIFNULLを使用できます。
  2. Field に渡されるジェネリックに null 許容型を使用します。

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

于 2013-08-24T18:30:38.023 に答える