2013-08-24 3 views
3

Я нахожусь в проекте C# ASP.NET.System.InvalidCastException: Указанное приведение недействительно. Ошибка

У меня есть таблица MySQL с полем userid типа int.

Теперь я хочу получить количество строк, где значение userid равно определенному значению с использованием LINQ.

Для достижения этой цели, я написал следующий метод:

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

Наиболее вероятной причиной InvalidCastException является линия x.Field<Int32>("userid"). Метод расширения Field<T> будет генерировать InvalidCastException в случае, когда фактический тип данных не соответствует типу, который был передан Field<T>. Следовательно, если userid не был Int32, это бы бросило.

EDIT

На основании ваших комментариев тип userid фактически UInt32 и не Int32. Это и вызывает проблему. Попробуйте использовать следующий и он должен работать

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

'mysql> desc vticketuser; + -------------- + ------------------ + ------ + ----- + - -------- + ------- + | Поле | Тип | Null | Ключ | По умолчанию | Экстра | + -------------- + ------------------ + ------ + ----- + - -------- + ------- + | Поиск | int (10) unsigned | НЕТ | | 0 | | | userid | int (10) unsigned | НЕТ | | 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") 

Ваш идентификатор столбца значение, вероятно, не является int, я бы поместил свои деньги на то, что это NULL?

ОБНОВЛЕНИЕ: Можете ли вы подтвердить, что это не полевой вызов, который ломается? Просто измените свой код, чтобы что-то вроде этого без вызова поля:

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 ("UserID") == (Int32?) usercode

+0

его Int и я на 100% уверен. Я перепроверил его. – user2168042

+0

@ user2168042 - Обновлен ответ с более подробной информацией о том, как узнать, правильны ли данные, и действительно ли поле . – BrutalDev

Смежные вопросы